B树索引和位图索引的结构介绍

简介: 一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法,类似于门牌号)? 因为所有行属于同一个段,所以要使用受限的ROWID 指向表行 索引是数据库为了提高查询效率提供的一种冗余结构,保守计算数据库50%以上的调优可以通过调整索引来进行优化...

一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法,类似于门牌号)? 因为所有行属于同一个段,所以要使用受限的ROWID 指向表行

索引是数据库为了提高查询效率提供的一种冗余结构,保守计算数据库50%以上的调优可以通过调整索引来进行优化;

引用国内一位资深的ORACLE专家的话:"我其实只懂点(挨踢)知识,IT里面其实只懂点甲骨文,甲骨文里面其实只懂点数据库,数据库里面其实只懂点SQL,SQL里面其实只懂点索引"——"你才是真正的专家!"

根据个人的浅薄的经验,作为DBA的日常运维会越来越少,从数据库的每个版本的更新来看,数据库系统已经趋向越来越智能话,DBA能干的活也越来越少了,如果一个DBA只能做做日常的表空间扩容、数据库的备份恢复、启停、系统的更新,那么将是很危险的一件事。而调优自古以来就是一门很高深的学问,如果能把这个做好了,那么DBA能够创造的价值和在公司的作用中,将越来越显著;

说了这么多,应该引入主题了,如果要做好调优,先从索引入手吧。

后续的章节中将陆续更新索引的一些知识,第一章从索引的类别开始吧;

 

二  索引在结构上的类别可划分如下:B树索引、位图索引、散列索引、反转索引等

 

三  索引的介绍:

1、B树索引(BTREE

B数索引是我们日常工作最最常用的索引,大家平时在工作中说的"索引"默认都是B数索引;

索引其实很简单,也很容易理解,用一本书的目录来形容最为贴切了,B树索引的结构跟图书馆的目录也很像

B树索引的结构:

索引的顶层为根,它包括指向索引中下一层次的条目。下一层次为分支块,它又指向位于索引中下一层索引中下一层次的块,最底层的是叶节点,它包含指向表行的索引条目。叶块是双向关联的,这边与按键值升序或降序扫描索引;

 

索引叶条目的格式

一个索引条目包含以下组件:

? 条目头:存储列数和锁定信息

? 键列长度/值对:用于定义键中的列大小,后面跟随列值(此类长度/值对的数目就是索引中的最大列数)。

 

索引叶条目的特性

在非分区表的B 树索引中:

? 当多个行具有相同的键值时,如果不压缩索引,键值会出现重复

? 当某行包含的所有键列为NULL 时,该行没有对应的索引条目。因此,当WHERE 子句指定了NULL 时,将始终执行全表扫描

 

对索引执行DML 操作的效果

对表执行DML 操作时,Oracle 服务器会维护所有索引。下面说明对索引执行DML 命令产生的效果:

? 执行插入操作导致在相应块中插入索引条目。

? 删除一行只导致对索引条目进行逻辑删除。已删除行所占用的空间不可供后面新的叶条目使用。

? 更新键列导致对索引进行逻辑删除和插入。PCTFREE 设置对索引没有影响,但创建时除外。即使索引块的空间少于PCTFREE 指定的空间,也可以向索引块添加新条目。

该图更能体现索引的结构

 

2、位图索引

位图索引(bitmap index)是从Oracle7.3 版本开始引入的。目前Oracle 企业版和个人版都支持位图索引,但标准版不支持。

位图索引在平时的OLTP系统中比较少见,但是在OLAP系统中就会经常见到,号称数据仓库调优的三个利器之一;

 

 

 

位图索引(通过在以下特定情况下,位图索引比B 树索引更有优势:

? 表具有数百万行且键列的基数较低时(也就是列的不同值极少时)。例如,对于护照记录表中的性别和婚姻状况列,位图索引可能比B 树索引更可取。

? 经常使用包含OR 运算符的多个WHERE 条件组合进行查询时

? 键列上的活动为只读活动或少量更新活动时(OLAP系统的特点)

 

位图索引的结构

位图索引也可以按B 树形式进行组织,但是,叶节点会存储每个键值的位图,而不是行ID 列表。位图中每一位与一个可能的行ID 对应,如果设置了该位,则表示具有对应行ID 的行包含键值。

如图所示,位图索引的叶节点包含:

? 条目头,其中包含列数和锁定信息

? 由每个键列的长度/值对组成的键值(在幻灯片的示例中,关键字只由一列组成;第一个条目的键值为Blue)

? 开始ROWID,在本示例中它指定块号10、行号0 和文件号3

? 结束ROWID,在本示例中它指定块号12、行号8 和文件号3

? 由位字符串组成的位图段(如果对应行包含键值,则会设置位;如果对应行不包含键值,则不会设置位。Oracle 服务器使用已获专利的压缩技术存储位图段。)开始ROWID 是位图中的位图段指向的第一行的行ID,也就是说,位图的第一位对应于该行ID,位图的第二位对应于块中的下一行。结束ROWID 是一个指针,它指向由位图段覆盖的表中的最后一行。位图索引使用受限的行ID。

 

使用位图索引

B 树用于定位叶节点,这些节点包含指定键值的位图段。开始ROWID 和位图段用于定位包含键值的行。

对表中的键列进行更改后,也必须修改位图。这会导致相关的位图段被锁定。由于锁是在整个位图段上获得的,因此,在第一个事务处理结束之前,其它事务处理不能更新位图覆盖的行。

 

 

文档的篇幅有限,先介绍最常见的B树索引和位图索引,这只是入门的第一步,后续将会陆续更新,多谢各位的关注。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技术博客:ORACLE 猎人笔记               数据库技术群:367875324 (请备注ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

相关文章
|
4月前
|
存储 算法 关系型数据库
MySQL索引 索引数据结构B+Tree、分类及使用、回表查询
MySQL索引 索引数据结构B+Tree、分类及使用、回表查询
102 0
|
9月前
|
存储 关系型数据库 MySQL
为什么MySQL索引结构采用B+树?
一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么MySQL索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希望听听我的见解。
105 0
|
存储 安全 Java
看懂哈希表及RandomPool结构
Java中最常用的哈希表莫过于HashMap和HashSet了,两者的结构一致,原理一致,唯独区别在于HashMap有伴随数据Value而HashSet没有。
82 0
看懂哈希表及RandomPool结构
|
存储 NoSQL 算法
数据索引
数据索引
|
算法 索引
【数据结构】动态查找表— B-树和B+树
【数据结构】动态查找表— B-树和B+树
154 0
【数据结构】动态查找表— B-树和B+树
|
存储 SQL 算法
FAQ系列 | B+树索引和哈希索引的区别
FAQ系列 | B+树索引和哈希索引的区别
162 0
FAQ系列 | B+树索引和哈希索引的区别
|
存储 关系型数据库 索引
Hash索引和B+树索引有什么区别或者说优劣势
Hash索引和B+树索引有什么区别或者说优劣势
398 0
|
存储 SQL 缓存
B+树索引使用(9)分组、回表、覆盖索引(二十一)
B+树索引使用(9)分组、回表、覆盖索引(二十一)
|
存储 关系型数据库 MySQL
mysql索引(二)索引的数据结构B+TREE
索引本质上是一种数据结构,让我们在查询数据的时候尽量减少磁盘I/O。 前边大概看了索引的原理。数据库的复杂性,以及读取磁盘时,磁盘I/O等。任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。
132 0
mysql索引(二)索引的数据结构B+TREE
|
存储 NoSQL 关系型数据库
B-Tree和哈希索引比较
MySQL B-tree hash 哈希 索引 InnoDB
100 0