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 性能调优的主要内容,如果未能解决你的问题,请参考以下文章