2011-02-11 47 views
0

我有一個查詢阻止了我使用此應用程序,因爲它可能需要7秒才能完成,因爲它沒有被緩存。如何讓這個MySQL查詢執行得更好?

SELECT attribute1 
FROM `product_applications` 
WHERE `product_applications`.`brand_id` IN (.. like 500 ids...) 
GROUP BY attribute1 

我有brand_id索引。我曾經這樣做了一個SELECT DISTINCT,但選擇了GROUP BY並且性能略有提高。

本表使用的是InnoDB,擁有約230萬行。我已經運行了一個EXPLAIN,它使用索引,它只是需要永遠。

我知道有很多變量來獲得像這樣的表演。該數據庫位於Amazon EC2實例上。

是否有某種表分割我可以做,以獲得更好的查詢執行?我非常感謝任何人可以提供的幫助。

編輯:

這裏是我的解釋,從對NewRelic的結果:

Id 1 
Select Type SIMPLE 
Table product_applications 
Type range 
Possible Keys brand_search_index_1,brand_search_index_2,brand_search_index_3,brand_search_index_4,brand_sarch_index_5 
Key brand_search_index_1 
Key Length 5 
Ref 
Rows 843471 
Extra Using where; Using index; Using temporary; Using filesort 

看到,它的使用索引。但它也使用臨時表和文件夾。我怎麼能克服那些東西?

編輯:

自從我開了這個問題的時候,我改變了發動機在該表上從InnoDB的在MyISAM。我還通過將屬性5到60移動到另一個表來垂直分區。但是這個選擇語句仍然在2到3秒之間!!!!這個查詢的糟糕表現令人生氣。

+0

最終結果集中有多少行? – 2011-02-11 20:47:49

+0

請寄出`SHOW CREATE TABLE product_applications`的輸出。 – 2011-02-11 20:48:24

+0

上面的查詢返回56行。 – AKWF 2011-02-12 02:33:03

回答

0

一種不同的方法,如果有極少數不同的值attribute1 IIS來嘗試attribute1指數採取loose index scan的優勢。

0

根據this answer在常量情況下,IN應該非常快,否則會發生可能會減慢速度的類型轉換。

我也會嘗試covering index,brand_id作爲第一列,attribute1作爲第二列。這應該加快速度,因爲你的表不會被訪問了。

編輯:

關於臨時/文件排序,我懷疑他們是由你的+500 IDS名單引起的。你可以嘗試EXPLAIN在IN運算符中只有一個id的查詢嗎?

0

如果您可以減少可能有幫助的行的大小。儘可能多的列不能爲空。如果你可以刪除所有可以幫助的varchar colums。

它使用的索引究竟是什麼?可能嘗試使索引覆蓋更少或更多的列。

您最近是否運行過分析表?這可能會導致它選擇另一個索引。你也可以嘗試強制某些索引。

是否有可能減少IN子句中的ID數量?如果使用範圍,如果它們始終是順序ID,那又如何呢?