联合索引-最左匹配原则
使用联合索引时,存在最左匹配原则,也就是按照最左优先的方式进行索引的匹配。如果不遵循「最左匹配原则」,联合索引会失效,这样就无法利用到索引快速查询的特性了。
联合索引生效
比如,如果创建了一个 (a, b, c)
联合索引,如果查询条件是以下这几种,就可以匹配上联合索引:
- where a=1;
- where a=1 and b=2 and c=3;
- where a=1 and b=2; 需要注意的是,因为有查询优化器,所以 a 字段在 where 子句的顺序并不重要。
联合索引失效
但是,如果查询条件是以下这几种,因为不符合最左匹配原则,所以就无法匹配上联合索引,联合索引就会失效:
- where b=2;
- where c=3;
- where b=2 and c=3; 上面这些查询条件之所以会失效,是因为(a, b, c)联合索引,是先按 a 排序,在 a 相同的情况再按 b 排序,在 b 相同的情况再按 c 排序。所以,b 和 c 是全局无序,局部相对有序的,这样在没有遵循最左匹配原则的情况下,是无法利用到索引的。
举例
我这里举联合索引(a,b)的例子,该联合索引的 B+ Tree 如下。
可以看到,a 是全局有序的(1, 2, 2, 3, 4, 5, 6, 7 ,8),而 b 是全局是无序的(12,7,8,2,3,8,10,5,2)。因此,直接执行where b = 2
这种查询条件没有办法利用联合索引的,利用索引的前提是索引里的 key 是有序的。
只有在 a 相同的情况才,b 才是有序的,比如 a 等于 2 的时候,b 的值为(7,8),这时就是有序的,这个有序状态是局部的,因此,执行where a = 2 and b = 7
是 a 和 b 字段能用到联合索引的,也就是联合索引生效了。