【问题标题】:MySQL UNION ALL performance tuningMySQL UNION ALL 性能调优
【发布时间】: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

标签: mysql query-optimization union-all


【解决方案1】:

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

让我们剖析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 ..

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

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多