当前位置: 首页 > news >正文

索引-最左匹配

在数据库索引中,最左匹配原则确实在遇到某些范围查询时会停止向右匹配,但对于 >=<=BETWEEN 和前缀匹配的 LIKE,索引匹配可以继续使用后续列。以下是详细分析:


1. 最左匹配原则的核心规则

最左匹配原则要求查询条件从复合索引的最左侧列开始,且不能跳过中间列。例如,索引 (a, b, c)

  • ✅ 有效使用索引的条件:a=1a=1 AND b=2a=1 AND b>2 AND c=3
  • ❌ 无效的条件:b=2(未指定 a)、a=1 AND c=3(跳过 b)。

2. 范围查询对索引匹配的影响

当遇到范围查询时,其右侧的索引列可能无法被使用,但具体行为因操作符而异:

(1) 严格范围查询(如 ><
  • 索引匹配停止:右侧列无法使用索引。
    -- 索引使用情况:(a, b)
    SELECT * FROM table WHERE a=1 AND b>2 AND c=3;
    
(2) 闭合范围查询(如 >=<=BETWEEN
  • 索引匹配可继续:MySQL 优化器可能将闭合范围转换为等值查询+范围查询的组合,允许后续列使用索引。
    -- 索引使用情况:(a, b, c)
    SELECT * FROM table WHERE a=1 AND b>=2 AND c=3;
    
(3) 前缀匹配的 LIKE(如 LIKE 'abc%'
  • 索引匹配可继续:前缀匹配被视为范围查询(类似 >= 'abc' AND < 'abd'),右侧列仍可能使用索引。
    -- 索引使用情况:(a, b, c)
    SELECT * FROM table WHERE a=1 AND b LIKE '2%' AND c=3;
    

3. 示例验证

以索引 (a, b, c) 为例,通过 EXPLAIN 分析:

场景 1:使用 >
EXPLAIN SELECT * FROM table WHERE a=1 AND b>2 AND c=3;
  • 结果key_len 仅覆盖 abc 未被使用。
场景 2:使用 >=
EXPLAIN SELECT * FROM table WHERE a=1 AND b>=2 AND c=3;
  • 结果key_len 覆盖 abc(若优化器将 b>=2 转换为 b=2 OR b>2)。
场景 3:使用 BETWEEN
EXPLAIN SELECT * FROM table WHERE a=1 AND b BETWEEN 2 AND 5 AND c=3;
  • 结果BETWEEN 被优化为 b>=2 AND b<=5,可能继续使用 c
场景 4:使用 LIKE '2%'
EXPLAIN SELECT * FROM table WHERE a=1 AND b LIKE '2%' AND c=3;
  • 结果:前缀匹配触发范围查询,c 仍可能被索引覆盖。

4. 原理与优化器行为

  • 闭合范围的优化>=<=BETWEEN 可能被拆分为等值查询和范围查询的组合,允许后续列使用索引。
  • 前缀匹配的本质LIKE 'abc%' 被转换为 >= 'abc' AND < 'abd',视为范围查询但允许继续匹配右侧列。

5. 总结与建议

操作符类型是否停止后续索引匹配示例
严格范围查询(><✅ 停止a=1 AND b>2 AND c=3
闭合范围查询(>=<=BETWEEN❌ 不停止(可能继续)a=1 AND b>=2 AND c=3
前缀匹配(LIKE 'abc%'❌ 不停止a=1 AND b LIKE '2%' AND c=3

建议

  1. 优先使用 >=<= 替代 ><,以最大化索引覆盖。
  2. 合理设计索引顺序,将等值查询列放在范围查询列左侧。
  3. 通过 EXPLAIN 验证实际执行计划,避免假设优化器行为。

相关文章:

  • 【项目设计】基于AMQP协议实现的简单消息队列
  • android okhttp几种日志拦截级别区别
  • 数据可视化图表库LightningChart JS 全新发布v7.0——提高视觉质量
  • 7-9 抢红包
  • 从技术创新到全球布局:MOVA割草机器人以尖端科技定义智能园艺
  • 电脑一直重启怎么解决 原因及解决方法
  • PHP前后开发纪录
  • (2025|ICLR|厦大华为,LoSA,基于表示互信息的动态层级稀疏率,基于重构误差的秩分配)LLM 的动态低秩稀疏自适应
  • 【Academy】SSRF ------ Server-side request forgery
  • golang从入门到做牛马:第十八篇-Go语言递归函数:函数的“自我调用”
  • Java高频面试之集合-10
  • 大模型中的Token是什么?
  • 高效管理应用资源--Qt资源系统详解
  • 第四篇《XTTS 跨平台迁移:让数据库无缝跨越操作系统》(XTTS)
  • Labelme 3.16.7 数据标注(通过pycharm下载+颜色修改+批量转化json)
  • 14 | fastgo 三层架构设计
  • C++初阶—stack和queue类
  • 网络爬虫-1:发送请求+维持会话+代理设置/超时设置
  • Prompt engineering设计原则(一)
  • 《python》—— threading库(线程和多线程)
  • 怒江州委常委、泸水市委书记余剑锋调任云南省委省直机关工委副书记
  • 商务部新闻发言人就波音公司飞回拟交付飞机答记者问
  • 杭州一季度GDP为5715亿元,同比增长5.2%
  • 幸福航空五一前三天航班取消:客服称目前是锁舱状态,无法确认何时恢复
  • 借助AI应用,自闭症人群开始有可能真正“读懂他人”
  • “中国游”带火“中国购”,“即买即退”让外国游客购物更丝滑