MySQL中Union与UnionAll速度差异,主要在于去重操作对临时表产生的开销如何影响查询效率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计693个文字,预计阅读时间需要3分钟。
因为 `UNION` 不是合并重复再删除,而是强制走一遍 `DISTINCT` 流程——排序+临时表+行级比较。MySQL 必须先把所有子查询的结果写入一个临时表,再按所有列进行排序和行级比较,最后输出唯一的结果集。
所以,如果你只选择了 `user_id` 一列,并且语句中只有 `UNION`,它会对整行进行排序和比较。
EXPLAIN 能看到的两个关键标记:Using temporary 和 Using filesort
执行 EXPLAIN SELECT ... UNION SELECT ... 时,如果出现:Using temporary:说明 MySQL 创建了内部临时表存中间结果Using filesort:说明它正在对临时表做全量排序(不是用索引排序)
这两个标记同时出现,基本就等于“慢查询预警”。而 UNION ALL 的 EXPLAIN 结果里,这两项通常都不会有。
本文共计693个文字,预计阅读时间需要3分钟。
因为 `UNION` 不是合并重复再删除,而是强制走一遍 `DISTINCT` 流程——排序+临时表+行级比较。MySQL 必须先把所有子查询的结果写入一个临时表,再按所有列进行排序和行级比较,最后输出唯一的结果集。
所以,如果你只选择了 `user_id` 一列,并且语句中只有 `UNION`,它会对整行进行排序和比较。
EXPLAIN 能看到的两个关键标记:Using temporary 和 Using filesort
执行 EXPLAIN SELECT ... UNION SELECT ... 时,如果出现:Using temporary:说明 MySQL 创建了内部临时表存中间结果Using filesort:说明它正在对临时表做全量排序(不是用索引排序)
这两个标记同时出现,基本就等于“慢查询预警”。而 UNION ALL 的 EXPLAIN 结果里,这两项通常都不会有。

