MySQL UNION ALL 性能调优

Posted

技术标签:

【中文标题】MySQL UNION ALL 性能调优【英文标题】:MySQL UNION ALL performance tuning 【发布时间】:2017-09-18 07:24:31 【问题描述】:
SELECT `col1` FROM `tbl1`;   -- takes 0.0022s

SELECT `col1` FROM `tbl2`;   -- takes 0.0017s

SELECT `col1` FROM `tbl1`
UNION ALL 
(SELECT `col1` FROM `tbl2`); -- takes 0.1100s

为什么UNION ALL 工作缓慢?

使用UNION ALL的任何其他替代方法?

【问题讨论】:

为您的查询提供EXPLAIN 计划 尽量避免第二个选择周围的 () @scaisEdge 没关系,删除它后返回相同的输出成本相同的时间 @MKhalidJunaid 你能详细说明一下吗?我使用了解释 sql 但我想知道 union all 减慢两个 sql 的原因, @MD.KamruzZamanRana 要知道原因首先你必须调查Obtaining Execution Plan Information 【参考方案1】:

Query Cache 是否打开?可能是两个人SELECTs 由于从 QC 获取结果集而人为地加快了速度。

让我们剖析UNION 以了解它的迟钝:

    为结果集创建一个临时表。 首先执行SELECT,将结果写入该临时文件。 执行第二个SELECT,将结果写入该温度。 读取临时表。 (重复数据删除。自从您在UNION 上说ALL 后,这并没有发生。) 将结果交付给客户。 删除临时表。

有两件事可能使情况恶化:

Windows 在建表方面比 *NIX 慢。 直到最近的 mysql 版本,一些 UNIONs 才能避免临时表。也就是说,将来每个SELECT 的结果都可以直接传递给客户端。你显然没有这样的版本。

至于括号,保留它们。也将它们放在另一个 SELECT 上。它不会影响性能,但可能会影响结果。例如,想象一下GROUP BY 在这三种情况下的应用:

-- Case 1
SELECT ..     UNION SELECT ..   GROUP BY ..

-- Case 2
SELECT ..     UNION ( SELECT ..   GROUP BY .. )

-- Case 3
( SELECT .. ) UNION ( SELECT .. ) GROUP BY ..

第一个与第二个相同,而不是第三个。

【讨论】:

以上是关于MySQL UNION ALL 性能调优的主要内容,如果未能解决你的问题,请参考以下文章

MySQL性能调优 – 你必须了解的15个重要变量

[活动通知]MySQL性能调优的六大心法

MySQL性能诊断与调优

MySQL性能调优与架构设计 PDF扫描版 下载

MYSQL_性能调优目录

MYSQL_性能调优目录