2012-07-10 95 views
2

如果我試圖增加使用特定表中4個不同列的查詢的性能,我應該創建4個不同的索引(每個索引單獨一個),還是應該創建1個索引以及所有列包括在內呢?MySql二級索引

+2

你應該嘗試每個想法,你能拿出和前後比較性能,然後使用一個,讓所有使用情況最好的整體表現上升。 – mellamokb 2012-07-10 19:22:44

+0

我不介意嘗試每一個......主要的問題是創建這些索引可能需要每個8-10小時,這個問題可以解決得越快越好。如果沒有人有任何具體的理由去做這一個或另一個,這將是我的方法 – Miles 2012-07-10 19:23:35

+1

把你的數據的一個子集,轉儲到sqlfiddle,至少你可以看看執行計劃,而不需要8-10小時。 – 2012-07-10 19:24:50

回答

2

具有所有4個值的一個索引是我的經驗最快的。如果您使用某個地方,請嘗試將這些列放置在一個順序中,以使其對該地點有用。

0

具有所有四列的索引;在WHERE中使用的列應該首先出現,而那些爲你做==比較的列應該首先出現。

有時,優先考慮整數列可以獲得更好的結果;因人而異。

因此,例如,

SELECT title, count(*) FROM table WHERE class = 'post' AND topic_id = 17 
    AND date > @@BeginDate and date < @@EndDate; 

會對指數:topic_id,張貼,日期和標題,在這個秩序。

僅使用索引中的「標題」,以便DB可以爲匹配查詢的記錄找到「標題」的值,而不額外訪問數據表。

第一個字段的記錄分佈越平衡,你會得到最好的結果(在這個例子中,假設10%的行有topic_id = 17,那麼你將丟棄其他90%,而不需要用'post'運行字符串比較 - 不是字符串比較特別昂貴。根據數據的不同,您可能會發現最好先指定日期並稍後發佈,或者甚至先使用日期作爲MySQL PARTITION。

+0

然後再次,有多少個查詢?您應計算查詢成本乘以該查詢的訪問次數;請記住,索引維護會增加總體成本(例如INSERT和UPDATE會運行得慢一點)。 – LSerni 2012-07-10 19:34:53