2016-11-28 25 views
-1

我已經有22場或即屬性的MySQL表Geo, Theater, Area, TotalSales集體指數或個別指數,這是最快的數據訪問

我想TotalSales可能是一個GeoTheaterArea或可能 特定theater特定Geo等等。

表由幾乎302245記錄

那麼,如何建立索引以提高訪問速度? 我應該把索引單獨在每個領域,即geo的,theater

,或者

我應該把索引上的所有22場集體像, index on (geo, theater, area, TotalSales... and so on)

回答

1

複合INDEX(geo, theater, area, ...)只會幫助如果第一個列(geo,在此示例中)包含在WHERE子句中。所以這不是一個好的候選人。

22列上的單獨索引是一個醜陋的可能性,但可能接近'最好'。

索引「標誌」列(是/否,M/F,ON/OFF等)幾乎總是沒用。通常,如果索引不會將結果集限制爲小於表的約20%,則優化器將決定表掃描比在索引和數據之間來回跳動更快。因此,通過消除任何低基數列來減少22。

另一方面,'複合'索引通常很好,即使它們包含一個標誌。您提到INDEX(geo, theater) - 如果兩者都指定,這將非常好,如果在WHERE中只指定了geo,也會很好。 (如果只指定了theater,則沒有用處)。因此,不考慮22個單列索引,請考慮22個雙列索引,其中22列中的每一列出現一次,作爲索引中的第一列列。

但是......好吧,我不想在這裏複製我的整個博客,所以讓我發送你到my index cookbook來發現如何做出「好」的索引。

但是......這引發了多少問題。 22是「太多」了。在某些時候,更多指標的開銷將超過收益。我建議你看看人們通常問。然後爲十幾個最流行的查詢制定最佳索引。

+0

謝謝你的幫助。但是我的數據庫中的WHERE子句只包含'Geo',或者只包含'Theatre'或者只包含'Area',或者可以是任意三個或三個或四個22列的組合。 – Anijit