MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>、<、between、like)就会停止匹配。。

我先说一下,我从看来的文章里理解的内容。

  • 例如,我创建了一张表,有A、B、C三个属性。我们在此基础上创建联合索引(A、B、C),实际上这是创建了三个索引,(A)(A、B)(A、B、C)。我们通过索引查询的时候,就可以查(A=?、B=?),Sql语言甚至有自动检测功能,当你输入的顺序不是按照索引的顺序时,例如,(B=?,A=?,C=?),这也是可以按照索(A、B、C)引来进行查找的。但是如果是查找(B=?,C=?)的时候,这时用的不是创建的索引(A、B、C),而是全索引,这是跟它的底层原理相关的,下面再谈。如果又有一个查询(A、B、C),不过B是范围查找的话,索引也只到A、B,因为B是范围查找,后面的字段就会停止匹配。

从上面可以看出最左前缀原则是在检索数据时按照规定的索引顺序来的。

这里有一片文章,介绍的比较详细,大家可以去看看。文章中有实例的测试,更加详细。
文章链接

底层原理

首先要知道,最左前缀原则是针对联合索引的,索引就要知道联合索引的实现原理。
它的底层是一个B+树,但键值数是大于1的。而构建一个B+树就只能根据一个键值来进行,所以数据库依据联合索引最左的字段来构建B+树。

下面是一个(A、B)的联合索引。

mysql like左匹配无效 mysql 最左匹配原则_mysql like左匹配无效

可以看到A是有顺序的,但是B不是,B的顺序是建立在A的基础上的。所以最左前缀原则是根据索引先匹配A,在匹配B。如果没有A,直接查找B的话,这就用不到(A、B)索引,而是全索引。