优化 UNION 查询

MySQL 总是通过创建并填充临时表的方式来执行 UNION 查询,因此很多优化策略在 UNION 查询中都没法很好地被使用。

经常需要手工地将 WHERE、LIMIT、ORDER BY 等子句“下推”到 UNION 的各个子查询中,以便优化器可以充分利用这些条件进行优化(例如,直接将这些子句冗余地写一份到各个子查询)。

除非你确实需要服务器消除重复的行,否则一定要使用 UNION ALL,这一点很重要。如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,这会导致对整个临时表的数据做唯一性检查,这样做的代价非常高。

最后更新于