2012-06-05 61 views
0

我正在處理一個相當大的數據庫,其中每一行都有一個特定的類。每個類都屬於一個泛化類,它在單獨的表中指定。所以,爲了找到一個項目的泛化類,必須執行一個JOIN。按分組SQL查詢範圍有效計算結果數

此外,其中一列包含某個數值,例如'w'。我試圖找到一個有效的查詢,它給出了'w'的特定範圍內的項目數量,並按廣義類別進行分組。因此,例如,結果行的人會給出與該類別的項目數的擊穿W¯¯< 500,500<瓦特< 1500和W> 1500

現在,我用一個預先存在查看已將廣義類加入結果集中,以便在最終查詢中不需要JOIN。最後的查詢使用我發現的一個技巧here來計算特定範圍內的項目數量。

SELECT generalized_class, 
    SUM(IF(w BETWEEN 1 AND 500, 1, 0)) AS low, 
    SUM(IF(w BETWEEN 500 AND 1500, 1, 0)) AS middle, 
    SUM(IF(w > 1500, 1, 0)) AS high 
FROM table_vw 
GROUP BY generalized_class 

但是,我不太確定這是否是最有效的方法。由於數據庫相當大,整個過程需要五分鐘才能完成。我想,計算這種東西一般來說是一個昂貴的操作,但我只是想知道我是否可以使用不同的方法來消除一些負載。任何人?

CNC中 視圖的定義是什麼壯觀,它像

CREATE VIEW table_vw AS SELECT d.id, d.class, c.generalized_class, <more fields>, 
(w_high/w_low)/2 AS w 
FROM base_table d 
LEFT OUTER JOIN secondary_table c 
    ON (d.class = c.class) 

我敢肯定有一個更左外連接被另一個表進行,但沒有從該表中的行(正如我所說的,這是一個預先存在的視圖,所以有很多東西不是爲這個查詢量身定做的)。連接行'class'僅在輔助表中編入索引。

+0

什麼是您當前使用的查看查詢?你加入的表格的結構和索引是什麼,目前的解釋計劃是什麼意思? – Ben

+0

請發佈viwe及其基礎表的定義。 – Quassnoi

回答

1

您的查詢需要很長時間才能執行的原因可能是它沒有正確使用索引(或根本不使用它們!)。 使用EXPLAIN查看MySQL如何執行您的查詢。
http://dev.mysql.com/doc/refman/5.5/en/explain.html

另一個原因可能是MySQL首先計算視圖的整個結果,然後用它來計算整個查詢的結果。
在這種情況下,解決方案是將視圖定義與您的查詢合併。

+0

我已經設法通過從視圖中剝離一些不必要的字段來獲得一些加速,但仍然需要相當長的時間。據我可以從EXPLAIN輸出中看到,索引很難解決問題。還有另一種重組或優化的方式嗎? – JorenB