讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么MySQL中的OR条件会导致查询无法命中联合索引?

云杰同学_6066

云杰同学_6066

发布时间:2026-06-23 08:49:55

|

746人浏览过

|

来源于php中文网

原创

OR条件破坏联合索引最左前缀匹配规则,因无法构造连续索引扫描路径;即使有联合索引(a,b),WHERE a=1 OR b=2也无法有效利用,优化器常选择全表扫描;index_merge union不可靠且低效;UNION ALL重写需额外单列索引支持;唯一稳妥走联合索引的OR是各分支均严格满足最左前缀。

为什么mysql中的or条件会导致查询无法命中联合索引?

OR条件破坏联合索引最左前缀匹配规则

MySQL 的联合索引(如 (a, b, c))依赖最左前缀原则:只有查询条件从左到右连续匹配索引列时,才能有效利用索引。而 OR 把多个不相关的等值或范围条件强行并列,导致优化器无法构造出一个连续的索引扫描路径。

比如 WHERE a = 1 OR b = 2,即使有联合索引 (a, b),优化器也无法同时用上 a 和 b 的位置关系——因为 a = 1 对应索引开头片段,b = 2 却散落在不同 a 值的子树里,物理上不连续。

  • 联合索引本质是 B+ 树按 (a,b) 排序的有序结构,b = 2 单独出现时,必须跳过所有 a 分支逐个查找,成本高
  • 优化器评估后认为:不如全表扫描一次,比多次随机跳转更便宜
  • 即使 OR 两边都命中同一联合索引(如 WHERE (a=1 AND b=2) OR (a=1 AND b=3)),8.0+ 可能走 range,但这是特例,不能依赖

OR触发Index Merge但不可控且低效

当 a 和 b 各有单列索引时,MySQL 5.7+ 可能启用 index_merge,在执行计划中看到 type: index_merge、key: idx_a,idx_b。但这不是稳定策略。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • index_merge 默认在 5.7 关闭,8.0 虽默认开启,但仅对 AND 下的交集(intersection)较可靠;OR 对应的是 union 模式,实际启用率很低
  • 是否启用取决于行数估算、索引选择度、缓冲区大小等隐式参数,同一语句在不同数据量下可能走完全不同路径
  • 即使启用,index_merge union 仍需合并多个索引结果集,涉及临时表和去重,性能常不如预期

UNION ALL重写时联合索引反而更难复用

有人试图把 WHERE a = 1 OR b = 2 拆成 SELECT ... WHERE a = 1 UNION ALL SELECT ... WHERE b = 2,期望每个分支走各自索引。但如果只建了联合索引 (a, b),第二个子查询 WHERE b = 2 依然无法使用它。

  • b 不是最左前缀,联合索引 (a,b) 对 b = 2 完全无效(除非加 WHERE a IS NOT NULL AND b = 2,但语义已变)
  • 此时必须额外建单列索引 idx_b(b),否则第二分支仍是全表扫描
  • 联合索引设计初衷是服务 WHERE a = ? AND b = ? 或 WHERE a = ? ORDER BY b 这类场景,不是为 OR 准备的

真正能走联合索引的OR写法极少

绝大多数 OR 场景都不该指望联合索引生效。唯一较稳妥的情况是:所有 OR 分支都严格满足最左前缀,且字段顺序一致。

  • 例如:索引 (status, created_at),查询 WHERE (status = 'paid' AND created_at > '2024-01-01') OR (status = 'refunded' AND created_at > '2024-01-01') —— 这可能走 range,因 status 是等值,created_at 是共同范围条件
  • 但一旦变成 WHERE status = 'paid' OR created_at > '2024-01-01',联合索引就彻底失效
  • 别为了迁就 OR 去堆砌冗余联合索引,优先考虑业务层拆查或改用 IN / 状态归类

联合索引不是万能胶,它的价值在于减少回表和排序,而不是兜底所有逻辑组合。遇到 OR,第一反应不应该是“怎么让这个索引生效”,而是“能不能换种方式表达需求”。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4363

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

911

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1149

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6301

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3123

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6260

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8521

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1150

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 3.3万人学习

MySQL索引优化解决方案
MySQL索引优化解决方案

共23课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn