首页/数据/SQL 速查/UNION 与 UNION ALL 的成本差异
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

UNION 与 UNION ALL 的成本差异

UNION 默认去重:需要临时表或排序去重;UNION ALL 直接拼接,配合外层排序与 LIMIT 更省。

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

示例

示例
-- 有重复可能时才用去重的 UNION
SELECT id FROM orders_2023
UNION
SELECT id FROM orders_2024;

-- 无重复语义用 UNION ALL:省去去重
SELECT id FROM orders_2023
UNION ALL
SELECT id FROM orders_2024;

-- 分支内各自 LIMIT,外层统一排序
(SELECT id, created_at FROM orders_2023 ORDER BY created_at DESC LIMIT 10)
UNION ALL
(SELECT id, created_at FROM orders_2024 ORDER BY created_at DESC LIMIT 10)
ORDER BY created_at DESC LIMIT 10;
去重代价UNION 多数实现要走临时表或排序去重
分支排序MySQL 支持括号包裹的分支各自 ORDER BY + LIMIT
索引每个分支独立使用各自的索引与过滤条件

易错点

  • 习惯性使用 UNION:结果集大时去重成本高,先确认业务是否真的需要去重
  • 想给分支加 LIMIT 却放错位置:MySQL 需要括号包裹分支,外层条件只作用于最终结果

数据来源与参考

  • MySQL 8.0 Reference Manual · UNION
  • PostgreSQL Documentation · UNION
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌