在mysql中按查询排序变得非常慢

Posted

技术标签:

【中文标题】在mysql中按查询排序变得非常慢【英文标题】:Order by query getting very slow in mysql 【发布时间】:2014-03-13 09:20:32 【问题描述】:

我有一个简单的查询,如下所示:

SELECT a.UserID, COUNT(1) NoOffriends
FROM UserMst a
LEFT JOIN UserFriends b on b.friendID = a.UserID
GROUP BY a.UserID 
ORDER BY 2 LIMIT 20;

上面的查询有足够的索引和关系,但它的执行速度仍然很慢。这需要 2 秒,但是当我从中删除“order by”子句时,它会在 90 毫秒内获取结果。我已经使用 EXPLAIN 命令检查了执行计划,它显示了“使用 where;使用临时的;使用 filesort',如何进一步检查?

【问题讨论】:

【参考方案1】:

来自文档:

可以在以下条件下创建临时表:

如果存在 ORDER BY 子句和不同的 GROUP BY 子句,或者 ORDER BY 或 GROUP BY 包含来自表以外的列 加入队列中的第一个表,创建一个临时表。

任何时候不能从索引执行排序,它就是文件排序。你可以看看here

而且由于您使用计算字段进行排序,mysql 必须计算将其放入文件中的每一行并对其进行排序以仅检索 20 个第一个。如果有很多数据,可能会很长。

删除order by Mysql 只需计算 20 个第一个结果并返回。

我没有直接的解决方案,只能重新考虑检索这些数据的方式。

【讨论】:

以上是关于在mysql中按查询排序变得非常慢的主要内容,如果未能解决你的问题,请参考以下文章

500000条记录后MySQL变得非常慢

在 MySQL 查询中按随机混合的记录排序

为啥索引会使查询变得非常慢?

MySQL Left Join 运行速度非常慢,拆分为 2 个查询要快得多

SQL Server:存储过程变得非常慢,原始 SQL 查询仍然非常快

MySQL 查询慢,按限制按顺序分组