order by --- limit 致使查询速度慢

  • 前言

在一次上线以后,发现一个列表查询出来的数据只有9条,可是数据出来的时间竟达到了3秒多。疑惑啊!mysql

  • 查找

通过服务的监控以及慢sql的查找,最终定位到是一条查询sql耗时3秒多。以下:sql

SELECT * FROM account WHERE type = ?  ORDER BY create_date LIMIT 10;
  • 分析

看起来sql很正常啊!接下去用EXPLAIN分析:code

查询的时候是create_date作索引的,也只扫描到了10行,EXPLAIN显示一切都很正常。orm

接下去发现其实总数据其实只有9条,可是咱们查询的时候是limit了10,不知道和这个有没有关系?blog

无奈之下只能开始查询各类资料。。。排序

  • 结果

最终发现是和以前的猜想相同。当limit的数据小于查询总数据量的时候,只要orderby有索引,数据会很快返回,此时使用的是索引排序。可是当limit的数据大于查询的总数据量的时候,这时候就要花里胡哨了。此时使用的是文件排序,他会全表从头开始扫描,直到把整个表都扫描完。最后无论够不够limit的数量,都会将结果返回。索引

此时若是where的子查询中条件如果有索引,也是能够避免我这种查询耗时很长的状况。it

  • 总结

order bylimit连用实际上是有不少注意点,包括会致使分页查询,不一样页查询到同一个数据的状况。io

固然都是能够经过一些方法解决,好比在limit前,count下总数据;指定主键id范围进行查询等,可是用的时候须要本身注意。form

最后记录下,mysql客户端直接查询慢sql的方法:

SELECT * from information_schema.`PROCESSLIST` where COMMAND<>'Sleep';
相关文章
相关标签/搜索