Mysql 在 order by 时索引的使用机制

今天在这里用最简单粗暴的实例方式的方法来验证下这个让同志们抓不着节奏的 order by 和 索引之间的关系

条件:1300w 条数据(呃,公司测试数据而已,不要在意)

            order by 中的所有字段都包含索引

180236_X2Ce_252076.png

主键 : id

索引 :capture_time    capture_time_id 

1:查询字段不包含 order by 字段

180809_DCY9_252076.png

结果:不使用索引 还特么上了 filesort 卡死你丫的

2:查询字段包含 order by 字段 + 其他字段

180816_GdL1_252076.png

结果:不使用索引

3:查询字段只包含 order by 字段

180824_yF5i_252076.png

索引生效

4:where 字段不包含 order by 字段

182019_xnIr_252076.png

5:where 字段包含 order by 字段

182025_15zh_252076.png

6:where 字段只包含 order by 字段

182034_L0Pt_252076.png

所以 where 查询只是能辅助而已 并不能真正避免 filesort

7:附加 limit 查询

182251_dQ7b_252076.png

182251_Fva3_252076.png

我已经实例不下去了:

1、若 select 字段集中包含 order by 字段集中以外的字段,则 order by 不使用索引

2、若 select 字段集与 order by 字段集一致(顺序无碍),则 order by 使用索引(当然要存在符合此字段集顺序的组合索引)

3、where 条件只是能在 Extra 中辅助作用而已

4、若添加 limit 查询则 order by 会使用索引, 无论 select 的字段集与 order by 是否一致(我觉得这个最有用,通常情况下我们很难保证select 字段集 和 order by 字段集对等的关系,而使用 limit 附加查询则可激活 order by 中最左匹配原则下的索引),再说了分页查询非常普及

今天被打败了,如果数据量很大的话,比如 order by id limit 1000000000,10 id的索引也不会被启用的,哎,大家还是多多的explain吧,开启 slow_query_log 什么的

 

转载于:https://my.oschina.net/sallency/blog/666582

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值