执行极其缓慢MySQL查询

问题描述:

此查询有多个JOIN包括功能执行极其缓慢MySQL查询

执行这个查询大约6000个用户用了20秒。

是否有任何其他方法可以更快地运行此查询?

SELECT users.id, SUM(orders.totalCost) AS bought, COUNT(comment.id) AS commentsCount, COUNT(topics.id) AS topicsCount, COUNT(users_login.id) AS loginCount, COUNT(users_download.id) AS downloadsCount 
FROM users 
LEFT JOIN orders ON users.id=orders.userID AND orders.status=1 
LEFT JOIN comment ON users.id=comment.userID 
LEFT JOIN topics ON users.id=topics.userID 
LEFT JOIN users_login ON users.id=users_login.userID 
LEFT JOIN users_download ON users.id=users_download.userID 
WHERE users.id='$userID' 
GROUP BY users.id 
ORDER BY `bought` DESC 

运行的结果解释 enter image description here

+3

确保您的表格列已正确编制索引。 – PHPglue 2014-09-20 06:35:12

+0

@PHPglue你能解释一下吗?或者给我一个例子?我知道主键和唯一索引,但我没有足够的索引键信息 – 2014-09-20 06:39:06

+1

运行EXPLAIN的结果是什么? – 2014-09-20 07:10:39

解释输出显示你正在做的一切全表扫描,除了users。您需要在联接中的所有其他表上创建第二个(非唯一)索引userID。这将加速对个人用户的查询。

但是,如果您要一次处理所有用户,请在没有WHERE users.id=子句的情况下执行一次选择。您的聚合每个用户只返回一行,您应该创建一个包含所有行的结果集并对其进行迭代,而不是为每个用户重新发布一次查询。在这种情况下,二级索引可能仍然有帮助,因为可以单独从索引确定计数,而无需查看表本身。