2011-03-07 44 views
6

更新後的問題:
假設我感興趣的數據只是那些field = 1的數據,實際的數據比率是1,而0的數據非常小(例如1%) 在這種情況下,將索引字段的好處我的select where field = 1查詢?在MYSQL中索引一個位域

原題:
我有,將有0或1值的int字段,索引將這一領域加快選擇的查詢,如:

 
select * from xxx where field=1; 

回答

4

一般來說,沒有。雙態字段在索引時不會加快查詢速度,因爲您必須平均查看一半行。您希望您的索引條目具有選擇性 - 索引中的給定條目應僅代表可能值的一小部分(例如,小於10%,最好是百分之幾)。然後使用索引忽略表中的大部分數據,這就是您獲得性能優勢的原因。

某些DBMS支持位圖索引。他們可以提供幫助,但你仍然遇到選擇性問題。


更新後的問題表示值爲1的值的數量將很小(小於1%);索引會給你一個好處嗎?

答案是:

  • 對於您指定的值是1,那麼,在列的索引可以提供有益的查詢,提供優化器實際上是利用索引。您可能需要調整數據庫管理系統,使其意識到索引偏向於將其用於值爲1的查詢;這往往是特定於DBMS的,但以各種形式更新統計數據是遊戲的名稱,可能也會在SQL查詢中使用提示。當然,如果優化器從不使用索引,那麼它仍然沒有提供任何好處 - 並且優化器可能會決定其他索引以某種方式幫助它。

  • 對於那些值爲0的查詢,不應使用索引。儘管如此,DBMS仍然會繼續保持0值的索引 - 儘管它不應該使用它們。這將是一個不尋常的數據庫管理系統,可以命令'只爲零以外的值索引這一列',儘管這樣做會非常有益。

所以 - 這取決於。它取決於查詢,它取決於優化器。

還要注意,複合索引 - 在其他一些常用的列上,然後是位域可能會提供一些好處。因此,如果您幾乎總是選擇某個日期範圍,那麼日期和位字段列上的複合索引(可能按該順序)應該會爲您提供一個好的索引。

0

是。但是您可能不希望將這樣一個小領域的更新帶來隨之而來的性能下降;如果您的行是50/50 0或1,則全表掃描可能仍然合理。

0

確實這些值不是唯一的,所以它必須掃描所有的值,並且二進制搜索沒有任何性能改進。

但是,還有其他的東西需要考慮。如果數據庫很大並且不適合內存,那麼在數據庫可以查看之前它必須將數據加載到內存中。如果存在包含數據的索引,那麼加載該索引的速度可能比整個錶快得多。可能取決於表格有多少列。