MySQL数据库——最左匹配原则

本文介绍了MySQL数据库中的最左匹配原则,说明在使用多列索引时,如果跳过索引中最左边的列,右侧列的索引将无效。详细讨论了范围条件、模糊查询对索引的影响,并解释了这一原则背后B+树的排序逻辑。内容包括如何理解索引失效以及在实际查询中如何避免这种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最左匹配原则的原因与索引B+树有一定关系,不清楚B+树的可以先了解一下MySQL索引——索引类型

内容

先说一下最左匹配原则以及相关的内容:

  1. 使用关联多列索引时,跳过左边的右边的全部失效
    例如:建立一个组合索引(a,b,c),写了查询条件where a = 1 and c = 3,索引a是最左边的,c是最右边的,而这里只写了a和c的条件,跳过了b,那b右边的c虽然写了条件c=3但是查询的时候也用不上

  2. 范围条件右边失效
    例如:建立一个组合索引(a,b,c),写了查询条件where a = 1 and b > 2 and c = 3,b是个范围条件,那么索引智能用到a和b,c是范围条件右边的内容,索引用不到
    注意:a = 1 and b > 2 and c = 3a = 1 and c = 3 and b > 2是一样的,a、b、c的顺序不是写sql条件时的顺序,而是建立索引时的顺序

  3. 模糊查询like '%'在左边时失效
    例如:条件where name like '%a',这里name这个索引时用不上的

原因

  1. 在建立组合B+树索引(a,b,c)时,会先根据a来排序,在a相同时再根据b数据来排序,a和b的值都相同才按c排序。看内容的第一条a = 1 and c = 3,数据库会根据索引找到a=1,但要找c=3,要扫描所有a=1的数据,因为只有a和b的值都相同时才会对c排序,只有排序的数据才能用上索引,而跳过b,对于a在说c的值就是乱序的没有经过排序。所以c的索引不会被用上,b的条件都没有被写上去当然也用不上,这里只有索引a有效

  2. 内容中的2原因也类似,c对于a = 1 and b > 2来说是乱序的。乱序不能被索引的原因和乱序不能用二分法查找类似

  3. 内容中的第3条,是因为字符串排序是根据一个一个字符来的,先按第一个字符排序,第一个字符相同的再按第二个字符排序,以此类推。知道了排序规则后再结合上面的解释就很容易理解了,可以把一个字符串看做一个组合索引,a是第一个字符,b是第二个字符,c是第三个字符,只有确定前面的值才能索引

注意
内容1、2条中,条件只能用and,不能or,比如a = 1 or b = 2可以把它看做是两个条件,a = 1b = 2,查找时a = 1是能用上索引但查找b = 2是不能用上索引的,总体还是用不上索引
也不能用 != 作为条件

### MySQL索引最左前缀匹配原理 在MySQL中,当创建复合索引(也称为联合索引),例如 `(a, b, c)` 时,查询优化器利用这些列的方式依赖于所谓的“最左前缀”原则。这意味着如果有一个由多个字段组成的索引,则只有从左边开始连续的部分可以被用于加速检索操作[^1]。 具体来说,在执行查询语句期间: - 如果仅涉及第一个字段 `a` 的条件过滤,那么整个多列索引都能发挥作用; - 当同时存在针对 `a` 和 `b` 字段的约束时,同样能够充分利用此组合键来提高效率; - 对于包含所有三个字段 (`a`, `b`, `c`) 的筛选表达式而言,自然也能享受到最佳性能增益; 然而需要注意的是,一旦中间某个位置上的属性缺失了相应的限定条件——比如只提供了关于 `b` 或者 `c` 的值而忽略了前面更靠左的位置上定义好的那些项——则后续右边剩余部分便不再适用于当前这条记录集的选择过程之中。 因此为了确保数据库引擎尽可能高效地运用已建立起来的各种形式的数据结构来进行快速定位目标数据行的操作,设计表结构以及编写SQL语句的时候应当充分考虑到这一点,并据此合理规划各个业务逻辑所对应的访问路径。 ```sql -- 正确使用最左前缀的例子 SELECT * FROM table_name WHERE a = 'value' AND b = 'value'; -- 错误使用最左前缀的例子 SELECT * FROM table_name WHERE b = 'value'; ``` #### 使用场景 对于需要频繁按照某些特定模式进行范围扫描或者精确查找的应用场合特别适合采用基于最左前缀特性的索引来提升整体读取效能。这包括但不限于以下几种情况: - 经常依据某几个固定顺序排列的关键字做为输入参数参与联接运算或是子查询内部作为参照对象的情况。 - 需要支持复杂条件下带有多种不同维度限制因子的同时作用下的统计分析需求。 - 场景涉及到大量时间序列型资料处理任务时,通过构建适当的时间戳与其他辅助信息相结合形成的有序列表可以帮助加快历史版本回溯等功能实现的速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值