繁体   English   中英

MySQL UNION ALL 性能调优

[英]MySQL UNION ALL performance tuning

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任何其他选择?

查询缓存是否打开? 由于从 QC 获得结果集,两个单独的SELECTs可能人为地快速。

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

  1. 为结果集创建一个临时表。
  2. 首先执行SELECT ,将结果写入该临时文件。
  3. 执行第二个SELECT ,将结果写入该临时文件。
  4. 阅读临时表。
  5. (去重。自从你在UNION上说ALL后就没有发生这种情况。)
  6. 将结果交付给客户。
  7. 删除临时表。

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

  • 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 ..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM