联合索引&最左匹配原则
什么是联合索引?
同时为多个列建立索引,以多个列的大小作为排序规则,比如一个联合索引(a,b,c),先按a排序,再按b排序,再按c排序的,联合索引本质上还是一个二级索引
。
最左匹配原则
什么是最左匹配原则?
在联合索引
中,必须按照最左优先的顺序进行匹配查询,不能跳过索引键,且前面的索引建不能范围查询,否则后面的索引建失效。
最左原则的底层原理 &为什么会形成最左匹配原则?
因为 联合索引中,后面的索引列的有序性是基于前面索引列的有序性的。
如果跳过前面的索引列,后面的索引列是无序的。
举例说明:
假如创建一个(a,b)的联合索引,那么它的索引树是这样的
可以看到a的值是有顺序的:1,1,2,2,3,3
,而b的值是没有顺序的:1,2,1,4,1,2
,因为b是在a有序的前提下有序。
即:a值相等的情况下,b值又是按顺序排列的,但是这种顺序是相对的。
所以最左匹配原则中
1、遇上范围查询就会停止,剩下的字段都无法使用索引。
例如a = 1 and b = 2
,a,b字段都可以使用索引,因为在a值确定的情况下b是相对有序的,
而a>1and b=2
,a字段可以匹配上索引,但b值不可以,因为a的值是一个范围,在这个范围中b是无序的。
2、跳过了前面的索引列,直接用后面的索引列是不行的。
比如本例中如果没有a索引,b索引是无序的。
建联合索引时,索引建的顺序安排的建议如下:
区分度最高的建在索引最左侧
使用最为频繁的列建在最左侧
长度小的字段放在最左侧
联合主键索引
有这么一个表,表结构定义类似这样的:
CREATE TABLE `geek` (
`a` int(11) NOT NULL,
`