我不确定发生了什么,但是我认为MySQL应该可以很好地处理此问题。
我有这样的SQL。
SELECT u.id AS user_id, SUM(t.amount) AS total
FROM user u
INNER JOIN transaction t ON t.user_id = u.id
WHERE u.condition = true
GROUP BY u.id
ORDER BY total DESC;
此查询运行10秒钟。
如果我删除ORDER BY子句,则时间约为4秒。
表非常大,但是在GROUP BY之后,我只有40行。排序40行真的需要6秒吗?我想说这应该由优化程序来处理。
但是,如果我这样运行查询:
SELECT *
FROM (
SELECT u.id AS user_id, SUM(t.amount) AS total
FROM user u
INNER JOIN transaction t ON t.user_id = u.id
WHERE u.condition = true
GROUP BY u.id
) data
ORDER BY total DESC;
此查询运行4秒钟。我知道我强迫MySQL只对从内部选择中检索到的40条记录进行排序。
我真的不明白一件事。 MySQL无法在GROUP BY之前按总数进行排序。那么,什么使查询变慢呢?
在这种情况下,我可以使用第二个查询,但是如果我有另一个内部SQL,MySQL将开始创建临时表,这可能会导致性能下降甚至超过ORDER BY。另一个“问题”是我使用ORM,而使用原始SQL确实很痛苦。
感谢您的建议。
编辑:
使用ORDER BY的执行计划
没有ORDER BY的执行计划
我可以在执行计划中看到,使用ORDER BY时还有其他文件排序+临时文件。