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

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

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

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

Mysql 在 order by 时索引的使用机制_第1张图片

主键 : id

索引 :capture_time    capture_time_id 

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

Mysql 在 order by 时索引的使用机制_第2张图片

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

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

Mysql 在 order by 时索引的使用机制_第3张图片

结果:不使用索引

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

Mysql 在 order by 时索引的使用机制_第4张图片

索引生效

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

Mysql 在 order by 时索引的使用机制_第5张图片

5:where 字段包含 order by 字段

Mysql 在 order by 时索引的使用机制_第6张图片

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

Mysql 在 order by 时索引的使用机制_第7张图片

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

7:附加 limit 查询

Mysql 在 order by 时索引的使用机制_第8张图片

Mysql 在 order by 时索引的使用机制_第9张图片

我已经实例不下去了:

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 中最左匹配原则下的索引),再说了分页查询非常普及




你可能感兴趣的:(mysql,索引,orderby)