位图索引初步


一、什么是位图索引
位图索引是一种使用 位图的特殊数据库索引。计算机所有信息最终都是通过“位bit”来运算的,二进制位运算在计算机中非常高效。而位图索引也是用0或1来处理索引进程,故得名位图索引。

长什么样?
比如 有个文件,记录里面有两个字段: 年龄(age) 婚姻状况(status)
这文件里有6个记录:
编号1: (20、未婚)
编号2:(22、未婚)
编号3:(24、未婚)
编号4:(26、已婚)
编号5:(28、已婚)
编号6:(30、二婚)
编号7:(30、未婚)
记录的编号,在我的理解就是oracle中总说的rowId。

age向量表
rowId1234567
201000000
220100000
240010000
260001000
280000100
300000011
status向量表
rowId1234567
未婚1110000
已婚0001100
二婚0000010
对与年龄这个字段来说,就形成了6个向量(20到30有6种)。以20为例,横着看向量的每行的每一位表示在这列的值是不是等于20。等于标1,不等标0。同理status表。
因此我们就得出了下面这2个表。
向量
201000000
220100000
240010000
260001000
280000100
300000011

向量
未婚1110000
已婚0001100
二婚0000010
表中的向量值就是每个值对应的位图索引。
怎么使用
如果我们需要求26 已婚
0001000
0001100
求按位与:0001000

《数据库》中例3.41中,同一表中的范围查找用按位或,两个表之间求交用按位与。
从2个表中能够看出来向量的位数或者长度取决记录的条数。记录条数越多,向量越长。所有向量的总位数就是记录的种类*记录条数。

二、特点和优点
1、从一中的例子中可以看到,位图索引为列的每个键值建立位图,位图中的每一位可能对应多个列,位图中位的值为1表示此行的值为对应的键值。
2、相对于B*Tree索引,占用的空间非常小,创建和使用非常快。

三、缺点
位图索引是为数据仓库而设计的,位图索引不适用于OLTP系统,如果系统中的数据会由多个并发会话频繁地更新,这种也不适用位图索引。原因在于,一个位图索引键条目指向多行。如果一个会话修改了所索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。
补充OLTP系统:On-Line Transaction Processing 联机事务处理过程(OLTP)。面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。也称实时系统。

四、使用条件
位图索引的使用一定要非常小心,同时满足以下两点的场景可以使用:
  1. 属性值可选项非常少的情况(比如性别)
  2. 属性基本上不做修改,十分固定(比如性别)
五、位图索引的压缩
回到刚才age=28的那个向量0000100 。在这个向量中大部分是0,1只占其中的很小一部分,大部分空间都被0占据了,因此压缩的目的就是压缩这些“0”。
《数据库系统实现》中提到的常用方法就是 分段长度编码。
5.1分段长度编码
将一个向量,分成多个段,分别取编码。
《数据库系统实现》中的段指:i个0后跟一个1组成的序列,大于等于0。
从这可以看出:
1、一个段只能有一个1,这个1一定是在这列的末尾。
2、一个段可以没有0,比如“1”这样个序列。
5.2编码方法
《数据库》中提到的编码方法是
1、确定0的个数i换算成二进制数所占的位数j。( j约等于log2 *i )j向上取整。
2、确定一元:《数据库》中的一元表示为:j-1个1,再加上1个0 。( 所以在压缩编码中这个0更像是一种分隔符)。
3、压缩编码形式为:一元+i的二进制数。

备注:如果i等于1(即只有1个0)那么编码为01,如果i等于0(即没有0)那么编码为00。
因为log2*1和log2*0的情况下j=1(j向上取整)。那么在一元中“1”的个数为0,“0”的个数永远为1。后面加上1(或0)的二进制表示。所以是01和00。

备注2:便于理解列出几个十进制数的二进制表示。
十进制二进制
311
210
11
00
5.3 解码方法
1、从头开始找到第一个0,在第几位上找到第一个0,那么我们需要找的二进制表示位就是几。
2、从刚才找到0的位置开始向后j位就是个数i的二进制表示数。
3、反复执行1和2的过程。
4、这样解码的向量都是以1为结尾的。但是向量有以0为结尾的,因为我们知道所有记录的数量,因此也就知道解码向量的长度。后面缺的位数直接补0即可。
备注:分段以1为分隔,解码以0为分隔。














  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值