MySQL的最左前缀原则
最左匹配原则
比如我们建立了一个(姓名,年龄)的索引,那么它可以用来匹配按名字的查找,但是按照年龄就不行。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
MySQL的索引中,有一种形式,叫做联合索引。即它可以创建多个字段联合起来的索引。语法如下:
1 | create index index_name on table_name(column_1, column_2, column_3) |
这种联合索引的好处在于:
创建联合索引,相当于创建了column_1,(column_1,column_2),(column_1,column_2,column_3)这三个索引。但是实际上只存在一个索引。这可以大大减小插入数据时修改索引所消耗的时间。
存在联合索引时,如果只查询联合索引这些字段,可以省去回表的时间。
通过联合索引可以筛选出来更少的数据。比如说下面的查询:
1
select from table where col1 = 1 and col2 = 2 and col3 = 3
如果只有第一个索引,那么查询完满足第一个条件的数据后,还需要回表去看是否满足第二个条件,第二个条件满足完后还需要看第三个条件。但是如果有联合索引,可以直接查出来满足所有的,这里其实也是满足不回表。
索引结构
假设存在联合索引(a,b,c),那么索引结构中,首先是按照a字段有序的,当a相同的时候,b是有序的,b相同后c才是有序的。但是整体来看,索引中b和c都是无序的。
所以说,当出现以下查询时
1 | select from table where b = 1 and c = 1 |
是无法走索引的。
1 | select from table where b = 1 and c = 1 and a = 1 |
当有a的时候,是可以走索引的。因为MySQL执行器是有优化的,会把sql改成以下:
1 | select from table where a = 1 and b = 1 and c = 1 |