mysql - 执行非常慢的 MySQL 查询

标签 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

最佳答案

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

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

关于mysql - 执行非常慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25945978/

相关文章:

MySQL 使用 UNION 连接 3 个表

c# - 实体类型 ApplicationUser 不是当前上下文模型的一部分,具有自定义用户存储的 DB First

mysql - Hive 查询中的错误

mysql - 如何在rails中进行mysql表分区?

mysql - Django将原始查询结果作为对象

php - 2 在 php pdo 中查询的可能值

mysql - 在不使用自连接的情况下显示详细信息

sql - PL SQL - 多列相等

select - Angular 6 无法自动从提供的对象中选择/绑定(bind)下拉列表值

php - codeigniter - 通过外键从不同数据库中的2个表获取数据的最佳方法