Scott's Blog

学则不固, 知则不惑

0%

B 树索引与位图索引简述

这篇文章简述了索引相关的知识,强烈推荐阅读引用的参考文章。

在 Oracle 中, 可以使用 CREATE INDEX 创建索引,索引的类型有以下几种:

  • Normal indexes (Oracle Database 默认使用的 B-tree 索引)

  • Bitmap indexes (用一个bit位来标记某个元素 rowid 对应的Value)

Refer Oracle 官方文档

B-tree

B-tree 的出现主要是为了提高访问磁盘的速度。那为什么使用 B-tree 实现而不是其他的数据结构呢?

对于二叉搜索树,红黑树,avl 树来说,每一个节点只能存储一个 key,如果你需要存储大量的 key,使用这些数据结构就会让树变得很高,但 B-tree 在一个节点内就可以存储多个 key,且可以拥有多个子节点,这就可以降低树的高度,提高磁盘访问速度。

那一个节点内可以存储多少个 key,可以拥有多少个子节点呢?

假设用 k (取值范围M-M/2)表示,则 B-tree 中的每个节点可以有 k-1 个 key,以及 k 个子树。

所谓 M 阶(m-way)B树,其中 M 就是表示 B-tree 中每个节点最多可以有几个子树。

B+ tree

B+ tree 是 B-tree 的升级版,一棵 B+ 树需要满足以下条件:

  1. 节点的子树数和关键字(Key)数相同(B 树是关键字数比子树数少一)
  2. 节点的关键字表示的是子树中的最大数,在子树中同样含有这个数据
  3. 叶子节点包含了全部数据,同时符合左小右大的顺序

B+ 树数据都在叶子节点,并使用一个链表将它们排列起来,这样在查询时效率更快。

由于 B+ 树的中间节点不含有实际数据,只有子树的最大数据和子树指针,因此磁盘页中可以容纳更多节点元素,也就是说同样数据情况下,B+ 树会 B 树更加“矮胖”,因此查询效率更快。

Bitmap 索引

我们知道计算机所有信息最终都是通过“位bit”来运算的,二进制位运算在计算机中非常高效。而位图索引也是用0或1来处理索引进程,故得名位图索引。 位图索引主要针对大量相同值的列而创建的,索引块的一个索引行中存储键值、起止RowId及此键值的位图,根据位图信息可以得知每一条记录的ROWID。它为列的每个键值建立位图,位图中的每一位可能对应多个列,位图中位的值为1表示此行的值为对应的键值。

特点:

  • 可以存储null值;
  • 不适合键值较多的列(重复数据较少的列),适合只有几个固定值的列;如性别、婚姻状况、行政区等等
  • 相对于B*Tree索引,占用的空间非常小,创建和使用非常快;
  • 适合静态数据,而不适合索引频繁更新的列;
  • 使用count、and、or或in查询时,直接用索引的位图进行或运算,快速得出结果行数据。

参考