MySQL索引的最左前缀匹配原则是什么?

基本概念:

MySql的最左前缀匹配原则是使用联合索引时,查询条件必须从联合索引的最左侧开始匹配,如果一个联合索引包含多列,则查询条件必须包含第一列,然后是第二列,依次类推。

底层原理:

联合索引在B+树中的排列方式遵循从左到右的顺序。例如联合索引(a,b,c),MySql在进行查找时会先匹配a,然后依次是b和c,跳过最左侧的索引将无法使用该联合索引,

例如:联合索引(a,b,c) 正常使用联合索引的情况:where a=1,b=2,c=3

不使用联合索引的情况:where b=2, c=3

使用联合索引的特殊情况:where a=1,c=3,因为这里使用了索引下推

索引下推

索引下推指的是本来该由server层做的操作,下推到存储引擎层过滤,这样做可以减少回表查询,较少I/O次数,提高查询效率

常见场景

where a > 1, b = 2, c = 3 会停止匹配, 所谓的停止匹配指的是:a可以用上联合索引,但是b和c却不行。因为 a 需要先经过范围查询,此时经过筛选得到b 和c的数据是无序的。比如 a 为 1和a为2数据之间b和c是无序的,因此无法利用索引查询。

详细解释:

  • 索引结构:假设有一个联合索引INDEX (a, b, c),这意味着索引是按照a、b、c的顺序存储的。
  • 范围查询的影响:当查询条件中包含a > 1时,数据库需要查找所有a值大于1的记录。由于a是一个范围查询,它将返回多个可能的a值,这些值对应的b和c值是无序的。
  • 索引匹配停止:因为a的值是无序的,索引无法保证b和c的顺序,所以索引在a处“停止”匹配。这意味着,对于b = 2和c = 3的条件,数据库无法直接使用索引来快速定位这些值,因为它们依赖于a的值,而a的值是不确定的。

后果

全表扫描:在这种情况下,数据库可能需要执行全表扫描来找到所有a > 1的记录,然后再检查这些记录是否满足b = 2和c = 3的条件。这会导致查询效率降低,尤其是在大数据量的情况下。

如果遇到如>=、<=、BETWEEN前缀like(xx%)的范围查询,则不会停止匹配。

因为都包含一个等值判断可以定位到某个数 然后往后扫描即可,这些场景不会出现停止匹配的现象

8.0版本之后支持跳跃索引,即使不满足最左前缀匹配原则,也可以走索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值