位圖索引的適用條件
位圖索引適合只有幾個固定值的列,如性別、婚姻狀況、行政區等等,而身份證號這種類型不適合用位圖索引。
位圖索引適合靜態數據,而不適合索引頻繁更新的列。
舉個例子,有這樣一個字段busy,記錄各個機器的繁忙與否,當機器忙碌時,busy為1,當機器不忙碌時,busy為0。
這個時候有人會說使用位圖索引,因為busy只有兩個值。好, 我們使用位圖索引索引busy字段!假設用戶A使用update更新某個機器的busy值,比如update table set table.busy=1 where rowid=100;,但還沒有commit,而用戶B也使用update更新另一個機器的busy值,update table set table.busy=1 where rowid=12; 這個時候用戶B怎么也更新不了,需要等待用戶A commit。
原因:用戶A更新了某個機器的busy值為1,會導致所有busy為1的機器的位圖向量發生改變,因此數據庫會將busy=1的所有行鎖定,只有commit之后才解鎖。
問題: 為什么更新了某個機器的busy值為1,會導致所有busy為1的機器的位圖向量發生改變,因此數據庫會將busy=1的所有行鎖定?
答案請看位圖索引的存儲結構。
位圖的存儲,位圖中位的個數和表中的記錄數項目,
比如下面婚姻狀況表
| 姓名(Name) | 性別(Gender) | 婚姻狀況(Marital) |
| 張三 | 男 | 已婚 |
| 李四 | 女 | 已婚 |
| 王五 | 男 | 未婚 |
| 趙六 | 女 | 離婚 |
| 孫七 | 女 | 未婚 |
表中有5行記錄,所以創建的記錄會有5位
性別列-男的位圖: 10100
性別列-女的位圖: 01011
已婚列的位圖: 11000
未婚列的位圖: 11000
離婚列的位圖: 11000
所以現在知道了吧, 當要更新位圖索引時,就要更新這個位圖,那么將會鎖定整個位圖或者要更新的這個位所在的塊。
