位图索引的适用条件

位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。

位图索引适合静态数据,而不适合索引频繁更新的列。

 

举个例子,有这样一个字段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

 

所以现在知道了吧, 当要更新位图索引时,就要更新这个位图,那么将会锁定整个位图或者要更新的这个位所在的块。