索引的最左前缀原则——MySQL

本文解析了如何利用复合索引b_c_d进行SQL查询优化,重点讲解了不同情况下索引的使用和避免,如不使用索引、仅依赖部分索引等,并揭示了索引最左前缀法则的应用实例。

索引的最左前缀法则:查询从复合索引最左边的列开始,并且不跳过符合索引中的列,如果跳过了某列,则从最左边开始只对按索引顺序匹配到的进行索引查询。
假设某表tablea,b,c,d,e列。
假设现在有联合索引:b_c_d

1、只使用索引b

 select * from table where b=null 

2、只使用索引b、c

 select * from table where b=null and c=null 

3、使用索引b、c、d

 select * from table where b=null and c=null and d=null

4、只使用索引b。

 select * from table where b=null  and d=null

**分析:**因为跳过了索引c,所以d不会走索引。
5、不使用索引。

 select * from table where c=null  and d=null

**分析:**因为是从索引b开始检索,而查询条件中没有b,所以不会走索引。

### 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、付费专栏及课程。

余额充值