2013-04-23 57 views
0

以下查询耗时5.5秒。由于这是一个简单的主键计数,并且这两个表都有< 5000条记录,所以我对它的速度非常惊讶。是否有任何解决方法来提高性能?mySQL使用子查询慢速计算主键

SELECT COUNT(*) 
FROM users 
WHERE (SELECT COUNT(*) 
     FROM clients 
     WHERE userID=users.id)=0 

我正在计算没有客户端的用户数量。

+0

上添加clients.userID索引后,该查询时间归结为0.036s – cronoklee 2013-04-23 11:21:33

回答

2

试试这个:

SELECT COUNT(*) FROM users u 
    left join clients c 
    on u.id = c.userID 
    where u.id not in (select userID from clients) 

DEMO HERE

+0

投掷通用语法错误不幸 – cronoklee 2013-04-23 11:01:43

+0

这可能会帮助你,我编辑 – 2013-04-23 11:06:56

+0

非常感谢,但这一个是5.99秒。它必须是我的数据库结构的问题。我会尝试在c.userID上添加一个索引 – cronoklee 2013-04-23 11:12:07

3

尝试此查询

SELECT 
    COUNT(*) 
FROM 
    users 
WHERE NOT EXISTS 
    (SELECT 
     userID 
    FROM 
     clients 
    WHERE 
     userID=users.id) 

或者你可以试试这个

SELECT 
    count(*) 
FROM 
    users u 
LEFT JOIN 
    clients c 
ON 
    u.id = c.userId 
WHERE 
    c.userId IS null 

上创建索引列

希望这有助于

+0

这绝对是更快 - 下降到3.69秒。还是很慢的寿。如果它是主键,我需要添加一个索引吗?我一直认为主键上的索引是隐含的? – cronoklee 2013-04-23 11:03:18

+0

是的,如果它是主键那么没有必要添加一个索引... – Meherzad 2013-04-23 11:03:52

+0

@cronoklee检查我发布的第二个查询,我假设userId不是客户端表中的主键,因此在那里创建索引.. – Meherzad 2013-04-23 11:09:34