我有一个简单的查询,如下所示:
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秒钟,但是当我删除"按顺序排除"从它开始的子句,它是在90毫秒内获取结果。我已经使用EXPLAIN命令检查了执行计划,它显示了我'使用where;使用临时;使用filesort',如何进一步检查?
答案 0 :(得分:0)
来自doc:
可以在以下条件下创建临时表:
如果存在ORDER BY子句和不同的GROUP BY子句,或者ORDER BY或 GROUP BY包含除表之外的表中的列 在连接队列中的第一个表中,创建了一个临时表。
无论何时无法从索引执行排序,它都是一个文件排序。你可以看看here
由于您使用计算字段进行排序,因此Mysql必须计算放入文件中的每一行并对其进行排序以仅检索20个第一。如果有大量数据,可能会很长。
删除order by
Mysql只需计算20个第一个结果并将其返回。
我没有直接解决方案,但重新考虑您检索此数据的方式。