现在的位置: 首页 > 数据库 > 正文

位图索引原理特点基础

2014年11月01日 数据库 ⁄ 共 1185字 暂无评论 ⁄ 阅读 1,758 次
文章目录

概念

我们知道计算机所有信息最终都是通过“位bit”来运算的,二进制位运算在计算机中非常高效。而位图索引也是用0或1来处理索引进程,故得名位图索引。

结构和原理

位图索引主要针对大量相同值的列而创建的,索引块的一个索引行中存储键值、起止RowId及此键值的位图,根据位图信息可以得知每一条记录的ROWID。它为列的每个键值建立位图,位图中的每一位可能对应多个列,位图中位的值为1表示此行的值为对应的键值。

位图索引查找RowId时,映射函数会把特定位置上的bit转化为实际的rowid。位图索引的工作是通过位逻辑运算,非扫描操作。举例,表account的product列大量重复出现6个值,所以给该列建立了位图索引,这个索引包含6个位图,如下图:

bitmap-index1

抽取其中DC和CHK两个位图做模拟解释,如下图:

bitmap-index2

优点

  • 相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。
  • B*Tree索引在创建时需要排序、定位等操作,而位图索引创建时不需要排序,并且按位存储,速度相对较快。
  • B*Tree索引由于不记录空值,当基于is null的查询时会使用全表扫描,而对位图索引列进行is null查询时则可以使用索引。
  • 当使用count()函数时,可以直接访问索引就快速得出统计数据。当根据位图索引的列进行and、or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据。因而,位图索引对表记录的访问较为高效。
  • 位图索引的查询性能经常是优于btree索引的,即便在值差别基数较大的情况下。
  • 对批量DML操作只需进行一次索引,此时对索引的更新速度比B*Tree索引一行一行的处理快得多。
  • 位图索引是可以多索引共同合作操作的,不像B*树索引只有一个会加入结果集合。

缺点

  • 不适合选择度底的列,否则服务器维护成本较高且造成查询效率低下。
  • 对于B*Tree索引,insert操作不会锁定其它会话的DML操作。而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定而导致性能低下。原因在于,一个位图索引键条目指向多行。如果一个会话修改了所索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。

用途

由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP(On-Line Analytical Processing联机分析处理系统)应用,也可以用于OLTP(On-Line Transaction Processing联机事务处理系统)中主要为读操作的表。

 

参考文章:

http://blog.csdn.net/yidian815/article/details/16891021

http://blog.itpub.net/17203031/viewspace-695055/

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?