一句话总结
- 普通小表、无索引场景 :用 OR 更简单、代码更短
- 大表、有索引场景 :用 UNION ALL 性能远优于 OR
- 需要去重 :必须用 UNION(性能比 UNION ALL 差)
核心区别
- 只扫描一次表 / 索引
- 数据库需要同时判断两个条件
- 致命问题 :大多数情况下,OR 会导致索引失效,变成全表扫描
- 比如:
WHERE id=1 OR name='test',即使 id、name 都有索引,数据库也可能两个索引都不用
- UNION ALL 的工作原理
- 执行两次独立查询
- 每个查询都可以独立使用自己的索引
- 结果直接拼接,不做去重
- 性能优势 :大数据量下,比 OR 快几倍~几十倍
3. UNION(不带 ALL)
- 会对最终结果去重 + 排序
- 性能比 UNION ALL 差很多
- 只有你必须去重时才用
什么时候必须用 OR?
-
小表 / 测试数据(几百、几千条)
- 数据量太小,性能差异可以忽略
- OR 代码更简洁
-
两个条件依赖同一行数据的关联判断
sql
WHERE (a=1 AND b=2) OR (a=3 AND b=4)
什么时候必须用 UNION ALL?
- 大表、生产环境、追求速度
- 查询条件可以命中不同索引
sql
-- id 有索引,name 有索引
SELECT * FROM t WHERE id=100
UNION ALL
SELECT * FROM t WHERE name='abc'
3.避免 OR 导致的索引失效
最终选择规则(背会这 3 条)
- 有索引 + 数据量大 ➜ UNION ALL(首选)
- 无索引 + 数据量小 ➜ OR(简洁)
- 需要去重 ➜ UNION(没办法)