MySQL中Union与UnionAll速度差异,主要在于去重操作对临时表产生的开销如何影响查询效率?

2026-04-30 21:170阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计693个文字,预计阅读时间需要3分钟。

MySQL中Union与UnionAll速度差异,主要在于去重操作对临时表产生的开销如何影响查询效率?

因为 `UNION` 不是合并重复再删除,而是强制走一遍 `DISTINCT` 流程——排序+临时表+行级比较。MySQL 必须先把所有子查询的结果写入一个临时表,再按所有列进行排序和行级比较,最后输出唯一的结果集。

所以,如果你只选择了 `user_id` 一列,并且语句中只有 `UNION`,它会对整行进行排序和比较。

EXPLAIN 能看到的两个关键标记:Using temporary 和 Using filesort

执行 EXPLAIN SELECT ... UNION SELECT ... 时,如果出现:
Using temporary:说明 MySQL 创建了内部临时表存中间结果
Using filesort:说明它正在对临时表做全量排序(不是用索引排序)
这两个标记同时出现,基本就等于“慢查询预警”。而 UNION ALLEXPLAIN 结果里,这两项通常都不会有。

阅读全文
标签:Mysql

本文共计693个文字,预计阅读时间需要3分钟。

MySQL中Union与UnionAll速度差异,主要在于去重操作对临时表产生的开销如何影响查询效率?

因为 `UNION` 不是合并重复再删除,而是强制走一遍 `DISTINCT` 流程——排序+临时表+行级比较。MySQL 必须先把所有子查询的结果写入一个临时表,再按所有列进行排序和行级比较,最后输出唯一的结果集。

所以,如果你只选择了 `user_id` 一列,并且语句中只有 `UNION`,它会对整行进行排序和比较。

EXPLAIN 能看到的两个关键标记:Using temporary 和 Using filesort

执行 EXPLAIN SELECT ... UNION SELECT ... 时,如果出现:
Using temporary:说明 MySQL 创建了内部临时表存中间结果
Using filesort:说明它正在对临时表做全量排序(不是用索引排序)
这两个标记同时出现,基本就等于“慢查询预警”。而 UNION ALLEXPLAIN 结果里,这两项通常都不会有。

阅读全文
标签:Mysql