2008-11-20 58 views
11

我讀過爲索引選擇的列應該很好地區分行,即索引列不應包含大量具有相同值的行。這表明布爾值或性別等枚舉對索引來說是不好的選擇。在索引中使用布爾值或枚舉列?

但是,如果我想按性別找到用戶,並且在我的特定數據庫中只有2%的用戶是女性,那麼在獲得女性用戶時,性別列似乎是一個有用的索引,但不是在得到所有男性用戶時。

那麼將索引放在這樣的列上通常是個好主意?

回答

1

這是我願意讓服務器的統計信息通知我的時候創建索引的情況下。除非你知道這個查詢將佔主導地位,否則運行這樣的查詢不會先驗地達到你的性能目標,那麼過早地創建索引可能會讓你付出性能而不是增加它。另外,您可能想要考慮如何實際使用查詢。在這種情況下,我猜測你通常會根據這一列進行某種聚合,而不是簡單地選擇符合條件的用戶。在這種情況下,無論如何你都會進行表掃描,索引不會爲你購買任何東西。

3

索引低基數列以提高搜索性能在我的世界中很常見。 Oracle支持爲這些情況設計的「位圖索引」。請參閱this article以獲得簡要概述。

我的大部分經驗是與Oracle,但我認爲其他RDBMS」類似的支持的東西。

2

不要忘了,不過,你可能只能選擇女性的時間約爲2%。剩下的時間,你會尋找男性。對此,直接表掃描(而不是索引掃描和訪問表中的數據)將更快。

還可以,有時,使用複合索引,與加上較高基數柱低基數柱(枚舉,布爾值)(出生日期,或許)。這很大程度上取決於完整的數據以及您真正使用的查詢。

我的經驗是,對男性/女性的指數很少會是真正有用的。一般建議是有效的。還有一點需要記住 - 在添加或刪除(或更新)行時,必須保留索引。索引越多,每個修改操作所做的工作就越多,從而減慢系統的速度。

有關於索引設計的全書。

+0

你的答案是好的,但考慮,而不是性別,我們存儲的主要城市或國家,這是隻有100號,分佈式amongs 100萬個用戶,所以大概1萬用戶將具有相同的價值,如果我們正在尋找只有一個特定的城市,那麼我不想讓DB重複100萬行,而正常的b +索引對於這個目的會非常糟糕,那麼在這種情況下你的建議是什麼? – 2011-07-23 09:29:30