注意:最左前缀原则、最左匹配原则、最左前缀匹配原则这三个都是一个概念。

最左匹配原则:在InnoDB的联合索引中,查询的时候只有匹配了前一个/左边的值之后,才能匹配下一个。

根据最左匹配原则,我们创建了一个组合索引,如 (a1,a2,a3),相当于创建了(a1)、(a1,a2)和 (a1,a2,a3) 三个索引。

为什么不从最左开始查,就无法匹配呢?

比如有一个user表,我们给 name 和 age 建立了一个组合索引。

ALTER TABLE user add INDEX comidx_name_1 phone (name,age);

组合索引在 B+Tree 中是复合的数据结构,它是按照从左到右的顺序来建立搜索树的(name 在左边,age 在右边)。

MySQL最左前缀原则/最左匹配原则_搜索

从这张图可以看出来,name 是有序的,age 是无序的。当 name 相等的时候, age才是有序的。

这个时候我们使用where name= ‘张三‘ and age = ‘20 ‘ 去查询数据的时候,B+Tree 会优先比较 name 来确定下一步应该搜索的方向,往左还是往右。如果 name相同的时候再比较age。但是如果查询条件没有 name,就不知道下一步应该查哪个节点,因为建立搜索树的时候 name 是第一个比较因子,所以就没用上索引。