首页/数据/SQL 速查/OR 条件与索引利用
性能与执行计划72 条

OR 条件与索引利用

同列多个等值条件优先写成 IN;跨列 OR 往往触发索引合并或全表扫描,改写 UNION 更可控。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 同列:IN 等价于多个 OR,可走 range
SELECT * FROM orders WHERE user_id IN (100, 101, 102);

-- 跨列 OR:依赖 index_merge,开销不稳定
SELECT * FROM orders WHERE user_id = 100 OR status = 'paid';

-- 改写为 UNION(两分支各自选择合适的索引)
SELECT * FROM orders WHERE user_id = 100
UNION
SELECT * FROM orders WHERE status = 'paid';
同列 OR优化器常合并为 IN/range,可用索引
跨列 OR可能走索引合并或全扫描;改写 UNION 后两分支各自选索引
注意UNION 去重有成本;确认语义后再决定用 UNION 还是 UNION ALL

易错点

  • 跨列 OR 只加索引不验证:是否走索引合并以 EXPLAIN 为准,不少场景仍是全扫描
  • UNION 改写后忽略去重语义:原 OR 会去重,改写时按需选择 UNION 或 UNION ALL

数据来源与参考

  • MySQL 8.0 Reference Manual §8.2.1.3 Index Merge Optimization
  • PostgreSQL Documentation · Multicolumn Indexes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌