2012-10-08 25 views
0

我正在嘗試創建一些有用的搜索篩選器,其中包含一旦選擇了選項就會被篩選的子集計數。但是,對於相當大的數據表,我懷疑我的查詢是非常低效的。我不確定還有什麼其他策略可以解決這個問題。如何使用GROUP BY和ORDER BY來處理MySQL結果集篩選器

id | color | size 
1 | Red | Small 
2 | Blue | Large 
3 | Green | Large 
4 | Blue | Small 
5 | Red | Small 
6 | Red | Small 

我有8個屬性列(如顏色,大小,類型)與500K加表中的記錄。

我試圖打造「過濾器」是這樣的:

SELECT `color`, COUNT(`color`) 
    FROM `table` 
GROUP BY `color` 
ORDER BY `color` 

而且將導致具有類似。

Blue (2) 
Green (1) 
Red (3) 

Large (2) 
Small (4) 

然後,一旦有人選擇過濾器,如小(4)中的一個,那麼我們就需要添加一個WHERE大小=小的話,那就有這樣的事情。

SELECT `color`, COUNT(`color`) 
    FROM `table` 
    WHERE `size` = 'Small' 
GROUP BY `color` 
ORDER BY `color` 

Blue (1) 
Red (3) 

但是,這開始運行得非常慢。我認爲這是因爲按順序排列的組可能會創建臨時表?另外,必須爲每個過濾器塊運行不同的查詢。用於彩色濾光片的SELECT color,用於尺寸濾光片的SELECT size。這導致這些groupby/orderby查詢中的8個查詢在500k數據表上運行。有沒有更好的方法呢?

一個問題是,結果集一直在變化,所以即使緩存5分鐘也可能有相當過期的結果數。

此外,請讓我知道是否有一些額外的數據,我需要提供,以幫助開發替代品。

回答

1

它將通過在列color上添加Index以及在列size上添加Index來提高其性能。

CREATE INDEX size_index ON tableName (size); 
CREATE INDEX color_index ON tableName (color); 

ALTER TABLE tableName ADD INDEX size_index (size); 
ALTER TABLE tableName ADD INDEX color_index (color); 
+0

感謝約翰。我有索引。 –