最左匹配原则

比如我们建立了一个(姓名,年龄)的索引,那么它可以用来匹配按名字的查找,但是按照年龄就不行。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

MySQL的索引中,有一种形式,叫做联合索引。即它可以创建多个字段联合起来的索引。语法如下:

1
create index index_name on table_name(column_1, column_2, column_3)

这种联合索引的好处在于:

  1. 创建联合索引,相当于创建了column_1,(column_1,column_2),(column_1,column_2,column_3)这三个索引。但是实际上只存在一个索引。这可以大大减小插入数据时修改索引所消耗的时间。

  2. 存在联合索引时,如果只查询联合索引这些字段,可以省去回表的时间。

  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

image-20231103161043899