位图索引区别于传统的B*树索引有两个结构特征。 一种情况是,叶节点上可能的索引列值对应于叶节点。 另一个指示在位图向量中与叶节点相对应的行是否取此索引值。 使用位图向量记录对应行的值不仅可以节约存储区域,而且可以利用计算机位图运算的快速特性提高索引结果的利用率。 用模拟分析一下吧。
http://www.Sina.com/http://www.Sina.com /模拟说明
假设有数据表t。 有两个数据列a和b,其值如下:
序列号
a
B
1
LL
1
2
t
2
3
LL
2
4
米
1
为两个数据列a和b分别创建名为idx_t_bita和idx_t_bitb的位图索引。 两个索引对应的存储逻辑结构如下:
Idx_t_bita索引结构。 对应于叶节点。
键值
开始rowid
退出rowid
位图
LL
xxx
ttt
1010
t
xxx
ttt
0100
米
xxx
ttt
0001
Idx_t_bitb索引结构。 对应于叶节点。
键值
开始rowid
退出rowid
位图
1
xxx
ttt
1001
2
xxx
ttt
0110
查询“select * fromtwhereb=1and (a=’l’ora=’m’)”
分析:位图索引的使用与B*索引有很大的不同。 B*索引的使用通常从根节点开始,依次通过分支节点与满足最近条件的叶节点进行比较。 在叶节点上的连续扫描操作“扫描”结果集合rowid。
位图索引的工作原理完全不同。 通过在不同的位图中直接取值的位运算(and或),取得结果集向量)计算结果)。
实例Bitmap可以拆分为以下操作:
1、a=’l’ora=’m’
a=L :矢量: 1010
a=M :矢量: 0001
or操作的结果是两个向量的或操作。 结果是1011。
2、合并b=1的向量
中间结果矢量: 1011
B=1:矢量: 1001
and操作的结果是1001。 翻译后,第一行和第四行是查询结果。
3、结果取得了rowid
现在知道开始rowid和结束rowid以及第1行和第4行的操作结果。 可以用估算的方法取得结果集合rowid
上述操作运算过程说明了两个问题。
位图索引可以组合使用多个索引,并且不像B*树索引那样添加到结果集中
位图索引的工作是位逻辑运算、非扫描操作