前言:
最左匹配原则在我们 MySQL 开发过程中和面试过程中经常遇到,为了加深印象和理解,我在这里把 MySQL 的最左匹配原则详细的讲解一下,包括它的原理以及是否导致索引失效的场景。
在讲解 MySQL 的最左匹配原则之前,我们需要了解一下 MySQL 的联合索引(也称复合索引),因为最左匹配原则是在联合索引的基础上产生的,没有联合索引就没有最左匹配原则这个概念。
一、联合索引
1、什么是联合索引
我们知道,单值索引指的是只使用一个字段作为索引字段的索引,而联合索引则是使用多个字段来共同构建成一个索引:
KEY idx_abc (a, b, c);
2、为什么要使用联合索引
2-1、减少开销
建一个联合索引 (a, b, c)
,实际上相当于建了 (a)、(a, b)、(a, b, c)
三个索引。这样我们就不需要创建 (a)、(b)、(c)
三个单值索引了。我们知道,每多一个索引,都会增加数据库写操作的开销和磁盘空间的开销,对于大量数据的表,使用联合索引会大大的减少开销!
2-2、覆盖索引
对联合索引 (a, b, c)
,如果有如下的 SQL:select a, b, c from test where a=1 and b=2
。那么 MySQL 可以直接通过遍历索引取得数据,而无需回表,从而减少了很多的随机 IO 操作。而减少 IO 操作,而减少随机 IO 是 DBA 主要的优化策略,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。
2-3、提高效率
联合索引的字段越多,通过索引筛选出的数据越少。假如有 1000W 条数据的表,有如下 sql: select * from table where a=1 and b=2 and c=3
,假设每个条件可以筛选出 10% 的数据,如果只有单值索引,那么通过该索引能筛选出 1000W * 10% = 100w
条数据,然后再回表从 100w 条数据中找到符合 b=2 and c=3 的数据,然后再排序,再分页。
但如果是联合索引,则通过索引直接筛选出的数据为:1000w * 10% * 10% * 10% = 1w
,这效率的提升可想而知!
二、最左匹配原则
1、最左匹配原则的规则
在联合索引当中,索引匹配时:最左字段优先,以最左边的字段为起点任何连续的字段索引都能匹配上,如果遇到范围查询 (>、<、between、like)
时就会停止匹配。
2、索引是否生效的场景
是否满足最左匹配原则是衡量联合索引命中与否的依据。存在的场景比较多,假设我们创建了以 a, b, c 三个字段的联合索引 idx_abc(a, b, c)
,下面我们分别展开讨论索引是否失效的场景。
2-1、全字段全值匹配
索引的全部字段都在查找条件当中,并且都是使用 =
进行全值匹配的情况下,索引是命中生效的:
select * from table_name where a = '1' and b = '2