关于位图索引(BitMap index)

有不少做BI的后台同事问我,位图索引是啥?啥时候用? 此篇仅作为一个扫盲篇,有不对的地方欢迎大神指正。

首先我们要搞明白位图索引是什么,与普通的B*树索引有什么区别呢?

顾名思义,首先他是个索引(废话!),其次是以位图的形式进行存储、计算的。

看个图,下面是我们常用的B*树索引结构(取自网络):
可以看得出,表中索引列的每行数据都会维护到索引树中(Null值除外)



再来看看我们的位图索引长什么样(取自网络):
位图索引中只维护distinct值,也就是说重复的值是不维护在树中,如下图中,一个表(19条数据)中索引列只有01、02、03,那么索引树中就只维护这三个值对应的索引条目,
条目中存储的是【Key + rowid_start + rowid_end + bitmap】


【Key  +  rowid_start + rowid_end + bitmap】
Key:值(16进制)
rowid_start :值对应的rowid起始位置
rowid_end :值对应的rowid结束 位置
bitmap:对应的位图值

前三个比较好理解,key就是值,rowid说明了这个值在表中对应的哪些列而说明了范围
bitmap存储的一串0和1(不是攻和受啊喂!)
代表了表中该索引列的值是否为真,呃。。。举个例子
首先明确一点1和0代表的是真和假,1为真,0为假,1就说明 此行等于该条目中的key,0 就说明此行不等于
上图的索引列中只存在01、02、03这3个值,
拿03来说,他的索引条目中存的是【0001001010001100010】,代表的含义是【假 假真假真假真假真真假真】,
真就说明这一行是03,假就说明这一行 不是03(可能是01,可能是02)

如果上面那些理解了就好办了,我们来看下 位图索引 的意义在哪里:
如表A如下,为了避免歧义,假设字段中一共3个值:男;女;妖,共9条记录:

A:

姓名

张三

李四

王五

赵六

小明

小王 

小红

小丽

小帅哥

性别

入学时间

2009

2009

2010

2010

2010

2009

2010

2009

2009


我们在 性别入学时间上分别建立了位图索引:
所以在【性别】的索引树上会有3个条目:男;女;妖
男的bit位为:1 0 1 1 0 1 0 0 1
女的bit位为:0 1 0 0 0 0 1 0 0
妖的bit位为:0 0 0 0 1 0 0 1 0

而【入学时间】的索引树上会有2个条目:2009;2010
2009的bit位为:1 1 0 0 0 1 0 1 1
2010的bit位为:0 0 1 1 1 0 1 0 0

那么在做如下查询的时候,位图索引的处理过程是如何的呢?
select t.name from A t
where t.gender = '男' and t.date = 2010
=====================================
男的bit位为:    1 0 1 1 0 1 0 0 1
2010的bit位为:0 0 1 1 1 0 1 0 0

and操作则会对这两租0和1进行 操作(or则是 操作)
result:            0 0 1 1 0 0 0 0 0
所以根据结果来看只有第3行和第4行满足where条件,也就是说最后查出的【Name】就是王五和赵六。

总结:

适宜OLAP系统

1. 选择在基数较小的列上建立位图索引

2. 在多个列上建立位图索引,且组合使用多列作为条件时。

不适宜OLTP系统

因为:根据上面的示例来说:索引中只有3个值,而表中共有19行,所以,当我维护ID等于03部分的行时,

所有ID=03的行都会被锁, 如果把03改为01,那么0301两个索引条目都会被锁,

所以说,对于事物频繁的系统(如交易系统等)不适合建立位图索引,

如果建了,会增加锁的时间,大幅减少并发,效率不仅无法提高,反而下降。





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26224278/viewspace-1789766/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26224278/viewspace-1789766/

你可能感兴趣的:(关于位图索引(BitMap index))