有不少做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:
姓名张三李四王五赵六小明小王 小红小丽小帅哥 性别男女男男妖男女妖男 入学时间200920092010201020102009201020092009
我们在性别和入学时间上分别建立了位图索引:
所以在【性别】的索引树上会有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】就是王五和赵六。
总结: