索引6:联合索引的最左匹配原则

联合索引的最左匹配原则
什么是最左匹配原则?
最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
在这里插入图片描述
举例 索引列A和列B 建立联合索引 index(A,B)(A,B顺序有序)
explain select X from XX where A=’‘and B=’’ 走 ab索引
explain select X from XX where A=’‘走 ab索引
explain select X from XX where B=’'不走 ab索引,索引type为ALL 走全表扫描。
在这里插入图片描述
最左匹配原则原理:
mysql创建复合索引的规则:会对复合索引第一个索引(即左侧第一个索引进行排序)再对第二个索引字段进行排序。类似order by 1 || and order by 2,因此保证了字段1是绝对有序的。字段2不能保证,根据MySQL的查询优化规则,会首先根据有序的索引查找减少时间。由此产生了最左匹配原则。
在这里插入图片描述
如图根据是最左匹配原则的类似B+树还原
根据col3,col2建立联合索引,如查找alice在B+树过程,查找关键字ALice会查询到叶子节点alice,存在多个alice情况下,会根据col2的值进行判断。

在这里插入图片描述
可以看到a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。所以b = 2这种查询条件没有办法利用索引,因为联合索引首先是按a排序的,b是无序的。

同时我们还可以发现在a值相等的情况下,b值又是按顺序排列的,但是这种顺序是相对的。所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。例如a = 1 and b = 2 a,b字段都可以使用索引,因为在a值确定的情况下b是相对有序的,而a>1and b=2,a字段可以匹配上索引,但b值不可以,因为a的值是一个范围,在这个范围中b是无序的。
1.匹配范围值

select * from table_name where a > 1 and a < 3
可以对最左边的列进行范围查询

select * from table_name where a > 1 and a < 3 and b > 1;
多个列同时进行范围查找时,只有对索引最左边的那个列进行范围查找才用到B+树索引,也就是只有a用到索引,在1<a<3的范围内b是无序的,不能用索引,找到1<a<3的记录后,只能根据条件 b > 1继续逐条过滤

2. 精确匹配某一列并范围匹配另外一列

如果左边的列是精确查找的,右边的列可以进行范围查找

select * from table_name where a = 1 and b > 3;
a=1的情况下b是有序的,进行范围查找走的是联合索引
3.最左匹配
建立索引(A,B,C)

select * from table_name where b = ‘2’
select * from table_name where c = ‘3’
select * from table_name where b = ‘1’ and c = ‘3’
这些没有从最左边开始,最后查询没有用到索引,用的是全表扫描

select * from table_name where a = ‘1’ and c = ‘3’
如果不连续时,只用到了a列的索引,b列和c列都没有用到
参考
https://blog.csdn.net/sinat_41917109/article/details/88944290
https://blog.csdn.net/qq_27559331/article/details/89632566

发布了7 篇原创文章 · 获赞 19 · 访问量 3475

猜你喜欢

转载自blog.csdn.net/qq_41627514/article/details/104299592