执行极慢的MySQL查询

时间:2014-09-20 06:31:56

标签: mysql select join

此查询包含多个JOIN,包括汇总功能

为大约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

1 个答案:

答案 0 :(得分:1)

EXPLAIN输出显示您正在对users以外的所有内容进行全表扫描。您需要在联接中的所有其他表上的userID上创建辅助(非唯一)索引。这将加快对个人用户的查询。

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