在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中按查询排序变得非常慢的主要内容,如果未能解决你的问题,请参考以下文章
MySQL Left Join 运行速度非常慢,拆分为 2 个查询要快得多