MySQL group by + order by非常慢

时间:2019-04-04 21:47:24

标签: mysql sql

我不确定发生了什么,但是我认为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的执行计划

Execution plan with ORDER BY

没有ORDER BY的执行计划

Execution plan without ORDER BY

我可以在执行计划中看到,使用ORDER BY时还有其他文件排序+临时文件。

0 个答案:

没有答案