MySQL索引部分生效原理是什么
MySQL版本5.6,Innodb引擎
如果数据库表是按照(a,b,c)建的联合索引
select * from myTest where a=3 and c=7;//a使用到了,c没有
select * from myTest where a=3 and b>7 and c=3;//a,b使用到了,c没有。
select * from myTest where a=3 and b>=7 and c=3;//abc都使用到了
上面3句sql都可以使用到联合索引,但是第一个是a使用到了,c没有
第二个是a,b使用到了,c没有。
第三个是abc都使用到了。
我就是不太理解为什么索引部分字段失效的原理?有没有大佬简单说一下上面的原因呢?
我知道:首先按照 a 进行排序,然后在相同 a 值的情况下按照 b 进行排序,最后在相同 a 和 b 值的情况下按照 c 进行排序
但是我想知道为什么部分字段没有用到索引,原理是什么?
1和3 =》 联合索引的数据也是有按顺序存储进去的,如果想在联合索引中使用尽可能多的列,索条件中的各个列必须是联合索引中从最左边连续的列。
2和3 =》 记录都是按照索引列的值从小到大的顺序排好序的,如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到B+树索引
至于3 可以拆解成
a=3 and b>7 and c=3
和
a=3 and b=7 and c=3 (这个是能用到 abc的)
推荐书籍:MySQL 是怎样运行的:从根儿上理解 MySQL - 第六章 和 第七章
会详细讲解这块