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

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

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

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

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

主键 : id

索引 :capture_time    capture_time_id 

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

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

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

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

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

结果:不使用索引

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

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

索引生效

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

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

5:where 字段包含 order by 字段

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

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

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

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

7:附加 limit 查询

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

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

我已经实例不下去了:

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