2010-10-03 68 views
3

我有一個10M行的表productcolor (int), price (float), weight (float), unitprice (int),等字段等...現在來自Web的用戶動態生成查詢,以隨機條件從此表中查找數據(顏色是必須在這裏)和訂單由諸如如何索引MySQL中的查找表

select * from product where color=1 and price >5 and price <220 and .... order by unitprice limit 75, 25; 

select count(*) from product where color=3 and weight <500 and price <30 ... ; 

如何在MySQL索引的表(InnoDB的或NDB)用約10個可能的過濾字段(範圍,排序...)這樣?


編輯:在我的理解MySQL最有可能將只選擇一個索引的查詢,只有組合索引的左手部分將工作。顯然索引所有可能的組合是不是一個可行的選擇,如(color, price, weight, create_date, unitprice, ....),(color, weight, price, create_date, unitprice, ....)(color, unitprice, weight, ....) ....不是所有的條件都一定存在於所有查詢。

你會怎麼做索引這個表?

回答

1

如果你想在任何現場快速查找/過濾/排序,你必須把指標上所有的人。

如果顏色IST必須具備的(即在每一個查詢中使用),這是最好的就(color, field)複合索引你有每個field

把聚集索引超過(color, product_id)也可能是值得一試,如果color真的是每一個普通的查詢的一部分。

+0

感謝您的提示。我在這個表中有10個這樣的字段。你建議只有兩個關鍵部分的複合指數?或全部10?是的,顏色將成爲所有指標的第一部分。 – 2010-10-03 08:44:13

+0

@QWJ我的建議是每個索引的兩個關鍵部分,您的表的10個索引。這樣MySQL就可以通過查看單個索引(color + x)來滿足查詢最重要的部分。這裏是[一些更多的閱讀主題](http://stackoverflow.com/questions/1277865/mysql-indexes-how-many-are-enough)。 – Tomalak 2010-10-03 08:52:22

+0

你可以,也許,收集有關所作查詢統計(通過寫查詢日誌,例如),並刪除那些很少使用,如果大量的索引開始證明麻煩的索引。 – 2010-10-03 09:18:38

0

由於託默勒格已經回答了,你應該添加索引的所有字段(和複合索引,這取決於你的查詢)。但是,這當然會減慢寫入速度。

如果你不知道該指標將如何使用,就可以使用explain命令。