簡體   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