最左匹配原则

最左匹配原则就是指在联合索引中,如果你的sql语句中用到了联合索引中的最左边的索引,那么这条sql语句就可以利用这个联合索引去进行匹配。例如某表现有索引(a,b,c),现在你有如下语句:

select * from t where a=1 and b=1 and c =1;     #这样可以利用到定义的索引(a,b,c)

select * from t where a=1 and b=1;     #这样可以利用到定义的索引(a,b,c)

select * from t where a=1;     #这样也可以利用到定义的索引(a,b,c)

select * from t where b=1 and c=1;     #这样不可以利用到定义的索引(a,b,c)

select * from t where a=1 and c=1;     #这样不可以利用到定义的索引(a,b,c)

也就是说通过最左匹配原则你可以定义一个联合索引,但是使得多种查询条件都可以用到该索引。
值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。也就是:

select * from t where a=1 and b>1 and c =1;     #这样a,b可以用到(a,b,c),c不可以

这条语句只有a,b会用到索引,c都不能用到索引。这个原因可以从联合索引的结构来解释。

最左匹配原则的原理

最左匹配原则都是针对联合索引来说的,所以我们可以从联合索引的原理来了解最左匹配原则。

我们都知道索引的底层是一颗B+树,那么联合索引当然还是一颗B+树,只不过联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。
例子:假如创建一个(a,b,c)的联合索引,那么它的索引树是这样的:
1.png
该图就是一个形如(a,b,c)联合索引的b+树,其中的非叶子节点存储的是第一个关键字的索引a,而叶子节点存储的是三个关键字的数据。这里可以看出a是有序的,而b,c都是无序的。但是当在a相同的时候,b是有序的,b相同的时候,c又是有序的。
通过对联合索引的结构的了解,那么就可以很好的了解为什么最左匹配原则中如果遇到范围查询就会停止了。以select * from t where a=5 and b>0 and c =1; #这样a,b可以用到(a,b,c),c不可以为例子,当查询到b的值以后(这是一个范围值),c是无序的。所以就不能根据联合索引来确定到低该取哪一行。

总结

  • 在InnoDB中联合索引只有先确定了前一个(左侧的值)后,才能确定下一个值。如果有范围查询的话,那么联合索引中使用范围查询的字段后的索引在该条sql中都不会起作用。
  • 值得注意的是,in=都可以乱序,比如有索引(a,b,c),语句select * from t where c =1 and a=1 and b=1,这样的语句也可以用到最左匹配,因为mysql中有一个优化器,他会分析SQL语句,将其优化成索引可以匹配的形式,即select * from t where a =1 and a=1 and c=1

标题:MYSQL | 最左匹配原则
作者:geektomya
地址:HTTPS://blog.zhqy.xyz/articles/2020/02/03/1580738653597.html
彧言:  正在加载今日诗词....