在写SQL查询时,经常需要把多个查询结果合并成一张表。这时候很多人会用到 UNION 或者 UNION ALL。但你有没有发现,有时候查得特别慢?其实,选对这两个关键字,速度可能差好几倍。
UNION 和 UNION ALL 有啥不一样
UNION 的作用是把两个查询结果合并,并自动去掉重复的行。而 UNION ALL 是直接拼接,不管有没有重复,全都照单全收。
举个例子,假设你在整理公司员工的打卡记录,两个部门分别导出了一份名单,里面有些员工重名。用 UNION 会帮你去重,只留一个;而 UNION ALL 就是简单粗暴地合在一起,哪怕名字一样也照加不误。
为什么 UNION ALL 更快
关键就在“去重”这个动作上。UNION 在合并完数据后,会自动对结果做一次去重操作,通常是通过排序或哈希比对来实现的。这个过程要消耗CPU和内存,数据量越大,拖得越慢。
而 UNION ALL 不做任何额外处理,就是单纯地把两堆数据摞起来,自然省时省力。
实际例子对比
比如有两张销售表,想查所有订单:
SELECT order_id FROM sales_jan
UNION
SELECT order_id FROM sales_feb;
这段代码会去重,但如果一月和二月的订单本来就不会重复,那去重就是白忙活。
换成下面这句,速度立马提升:
SELECT order_id FROM sales_jan
UNION ALL
SELECT order_id FROM sales_feb;
什么时候该用哪个
如果你确定两个结果集没有重复数据,或者你压根不需要去重,那就果断用 UNION ALL。比如按时间分表的场景,每天的数据独立,合起来也不会重复,这时候用 UNION 反而是浪费资源。
只有当你真的担心数据重复影响结果时,才用 UNION。比如从不同系统导入用户信息,可能会有相同手机号的记录,这时去重就有必要了。
日常写查询,别图省事默认用 UNION,先想想是不是真需要去重。一个小选择,可能让报表从10秒变成1秒。