概述
- 前言
在一次上线之后,发现一个列表查询出来的数据只有 9 条,但是数据出来的时间竟达到了 3 秒多。疑惑啊!
- 查找
经过服务的监控以及慢 sql 的查找,最终定位到是一条查询 sql 耗时 3 秒多。如下:
SELECT * FROM account WHERE type = ? ORDER BY create_date LIMIT 10;
- 分析
看起来 sql 很正常啊!接下去用 EXPLAIN 分析:
查询的时候是 create_date 做索引的,也只扫描到了 10 行,EXPLAIN 显示一切都很正常。
接下去发现其实总数据其实只有 9 条,但是我们查询的时候是 limit 了 10,不知道和这个有没有关系?
无奈之下只能开始查询各种资料。。。
- 结果
最终发现是和之前的猜测相同。当 limit 的数据小于查询总数据量的时候,只要 orderby 有索引,数据会很快返回,此时使用的是索引排序。但是当 limit 的数据大于查询的总数据量的时候,这时候就要花里胡哨了。此时使用的是文件排序,他会全表从头开始扫描,直到把整个表都扫描完。最后不管够不够 limit 的数量,都会将结果返回。
此时如果 where 的子查询中条件若是有索引,也是可以避免我这种查询耗时很长的情况。
- 总结
order by 和 limit 连用其实是有很多注意点,包括会导致分页查询,不同页查询到同一个数据的情况。
当然都是可以通过一些方法解决,比如在 limit 前,count 下总数据;指定主键 id 范围进行查询等,但是用的时候需要自己注意。
最后记录下,mysql 客户端直接查询慢 sql 的方法:
SELECT * from information_schema.`PROCESSLIST` where COMMAND<>'Sleep';
最后
以上就是傲娇电脑为你收集整理的order by --- limit 导致查询速度慢的全部内容,希望文章能够帮你解决order by --- limit 导致查询速度慢所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复