2010-11-13 22 views
3

我有一個包含UNION ALL的視圖。例如:包含UNION的MySQL視圖不能優化,換句話說,SLOW!

CRATE VIEW myView as 
(SELECT col1, col2, col3 
FROM tab1) 
UNION ALL 
(SELECT col1, col2, col3 
FROM tab2) 

這些是大型表,每個表中包含數百萬行。如果我寫:

SELECT * 
FROM myView 
LIMIT 1; 

而不是立即,它基本上永遠不會返回其他查詢寫入此視圖。如果我在針對單個基礎表的查詢中使用LIMIT,則它是立即的。我有基礎表上的索引。看起來MySQL在應用任何過濾標準之前爲視圖創建了整個聚合數據集(視圖內的查詢)。瘋了吧。這是MySQL優化查詢查詢的方式嗎?順便說一句,我甚至無法針對視圖運行解釋計劃,因爲它永遠不會返回。

回答

6

您遇到的行爲是如何在每個數據庫上處理非物化視圖。 MySQL不支持實體化視圖,它的視圖支持甚至不能與競爭對手相提並論...

非物化視圖只是它封裝的查詢的簡寫/宏/變量 - 沒有區別使用:

SELECT * 
    FROM myView 
LIMIT 1 

...和:

SELECT x.* 
    FROM (SELECT col1, col2, col3 
      FROM TAB1 
     UNION ALL 
     SELECT col1, col2, col3 
      FROM TAB2) x 
LIMIT 1 

沒有一個ORDER BY,充其量你要根據插入您的查詢來獲取第一行,你還不如正在運行:

SELECT col1, col2, col3 
    FROM TAB1 
LIMIT 1 

...因爲由於UNIONed語句返回記錄的順序,不太可能從TAB2中提取記錄。然後就是處理數百萬條記錄的問題......