2009-10-22 103 views
2

我有一個表具有以下字段的MySQL數據庫:應該索引多少個字段,我應該如何創建它們?

ID | GENDER | BIRTHYEAR | POSTCODE 

用戶可以搜索使用的任何字段的表中的任意組合(即SELECT * FROM table WHERE GENDER = 'M' AND POSTCODE IN (1000, 2000);SELECT * FROM table WHERE BIRTHYEAR = 1973;

從MySQL文檔,它使用左側索引。因此,如果我在所有4列上創建索引,則不使用ID字段的索引。我是否需要爲字段(ID; ID/GENDER; ID/BIRTHYEAR等)的每種可能組合創建一個索引,或者爲所有字段創建一個索引就足夠了?

如果它有什麼區別,這個表裏有300萬條記錄。

+0

你沒有提到ORDER BY:如果使用ORDER BY ... LIMIT,使用索引來執行順序,同時可以獲得巨大的勝利。你最常見的是什麼? – peufeu 2009-10-22 09:37:45

回答

0

使用說明。

(我會說,使用Postgres也是,大聲笑)。

看來最近的MySQL版本可以在同一個查詢中使用多個索引,他們稱之爲Index Merge。在這種情況下,每列1個索引就足夠了。

性別是一種特殊情況,因爲選擇性爲50%,您不需要索引就可以適得其反。

+0

其實,我們的用戶不需要給他們的性別,所以有3個選項:M,F和O. :) 既然只有3個選項,那麼索引是否仍然沒有必要? – cabuki 2009-10-22 09:11:24

+1

當您選擇多於約5-15%的行時,索引不起作用。閾值取決於許多因素,但您會明白:索引查找有成本。 – peufeu 2009-10-22 09:36:20

0

在單個字段上創建索引很有用,但如果您的數據是varchar類型並且每個記錄具有不同的值,那麼它會非常有用,因爲birthyear和postcode是已編好索引​​的數字。

你可以對生日年份進行索引,因爲它對許多記錄應該是不同的(但是最多可達120個新生兒,我猜最大)。

性別在我看來並不需要索引。

你可以找出哪些字段組合最有可能給不同的結果和索引,如:birthyear - postcode,id - birthyear,id - postcode。

1

在這種情況下,我通常會記錄搜索條件,返回的結果數量以及執行搜索所花費的時間。僅僅因爲您在任何領域創建靈活的搜索方式並不意味着您的用戶可以充分利用這種靈活性。我通常會在合理的組合上創建索引,然後一旦我確定使用模式就會放棄使用率低的索引或創建新的未知索引。

我不確定MySQL是否支持歪斜數據的統計量或直方圖,但性別上的索引是否可能工作。如果MySQL支持統計數據,那麼這將指示索引的選擇性。在一般人羣中,50/50分位的場地指數無濟於事。如果你的樣本數據是計算機程序員,並且數據是95%的男性,那麼搜索女性會使用該索引。

相關問題