UNION ALL 比 UNION 快因不执行去重和排序直接拼接结果集UNION 隐式添加 DISTINCT 和临时排序开销大易成性能陷阱。UNION ALL 为什么比 UNION 快因为 UNION ALL 不去重不排序直接拼接结果集UNION 会隐式加 DISTINCT 和临时排序开销大得多。如果你确定两个查询结果没有重复或者根本不在乎重复就别用 UNION —— 这是性能陷阱最常发生的地方。常见错误现象SELECT * FROM t1 UNION SELECT * FROM t2 执行慢但换 UNION ALL 瞬间变快EXPLAIN 显示用了 Using temporary; Using filesort。使用场景日志表按月分表后汇总、多业务线数据归集、ETL 中的增量全量合并注意列数和类型必须严格一致否则报错 ERROR 1222 (21000): The used SELECT statements have a different number of columns字符串长度差异会导致隐式截断比如 VARCHAR(10) 和 VARCHAR(255) 合并时MySQL 以最长为准但 TEXT 和 VARCHAR 混用可能触发警告列名和顺序怎么对齐才不出错UNION ALL 只认位置不认字段名。最终结果集的列名来自第一个 SELECT 子句后面所有子句的列顺序、类型、数量都得跟它对齐。容易踩的坑第二个查询漏写一列、或把 created_at 和 updated_at 顺序写反运行时不报错但数据错位——这种 bug 很难肉眼发现。建议显式写出字段名别用 *SELECT id, name, status FROM t1 UNION ALL SELECT id, title AS name, type AS status FROM t2类型不兼容时 MySQL 会尝试隐式转换比如 INT 和 VARCHAR 拼一起数值会被转成字符串再比较可能导致索引失效如果某张表缺字段用 NULL AS xxx 或 AS xxx 占位确保结构一致ORDER BY 和 LIMIT 怎么加才有效UNION ALL 整体不支持直接在末尾写 ORDER BY 或 LIMIT除非整个语句被括起来当子查询或者只对最后一个子句生效但通常不是你想要的。 幻导航网 发现优质实用网站,开启网络探索之旅