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

  • 前言

在一次上线之后,发现一个列表查询出来的数据只有 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 bylimit 连用其实是有很多注意点,包括会导致分页查询,不同页查询到同一个数据的情况。

当然都是可以通过一些方法解决,比如在 limit 前,count 下总数据;指定主键 id 范围进行查询等,但是用的时候需要自己注意。

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

SELECT * from information_schema.`PROCESSLIST` where COMMAND<>'Sleep';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值