【MySQL】之联合索引与最左匹配原则

前言:


最左匹配原则在我们 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值