原文:http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.adref.doc/adref235.htm
这部分B-tree索引页的结构的一般信息。是对感兴趣的读者的一个概况。更多信息请参考IBM Informix指南。
B-Tree定义
数据库用B-tree数据结构组织索引,图1显示了一个完整的B-tree索引是由下面三种不同类型的索引页或结点组成的。
图1 B-tree结构图
*一个根节点
根节点包含指向分支节点的指针。
*两个或两个以上的分支节点
一个分支结点包含指向叶子结点或其他的分支节点的指针。
*很多的叶子结点
一个叶子结点包含索引项和水平地指向其他叶子结点的指针。
每一个结点都有各自不同的功能,下面介绍各结点在索引中的功能。
索引项
索引的基本单位是索引项。一个索引项包含一个key值,它代表某个特定行的索引列。并且包含数据库用来在数据页中定位行的rowid信息。
结点
结点是存有一组索引项的索引页(好像翻译的不对)
索引的逻辑存储
这部分概述数据库任何创建和填充索引
根和叶子结点的创建
当你为一个表创建索引时,数据库只允许一个索引页。这页代表根结点并且直到你插入数据到表中都是空的。
开始时,从功能上来说,根节点和叶子节点一样。你往数据库表中插入一条记录,数据库在根节点上创建并添加一个索引项。图2说明了一个根节点在他被填充前是任何出现的(?)
图2 根结点
当根结点充满了索引项时,数据库根据以下步骤分裂根结点:
1,创建两个叶子结点
2,移动大约一半的根结点项给每一个新创建的叶子结点
3,把叶子结点的指针放入根结点
当你添加新行到数据库表中,数据库添加索引项到叶子结点。当叶子结点满时,数据库创建新的叶子结点,移动部分索引项到新的结点,并在根结点添加一个指向新叶子结点的指针。
例如,假定叶节点3要满了。数据库管理系统添加另一个叶子结点。数据库管理系统移动部分叶节点3的记录到新的叶节点,如图3所示。
图3 叶节点3满后创建叶节点3
分支结点创建
最终,当你在数据库表中添加记录时,数据库管理系统用指向现有的叶子结点指针填充根结点。当根结点分裂另一个叶子结点,并且根结点没有空间填充其他指针时,就会发生下面的情况。
数据库管理系统分裂根结点并划分其内容给两个新创建的分支(不知道如何翻译)。当索引列添加后,越来越多的叶子结点分裂了,导致数据库管理系统添加了更多的分支,最终,根结点填充了指向这些分支结点的指针。当此发生时,数据库管理系统再次分裂根结点。并在根结点和较低层次的分支创建另外的分支。最终结果是一个4层的树,一个根结点,2个分支层次和一个叶层。B-tree数据结构可以继续生长下去直到最大层次20层。
分支结点可指向其他在其下层的分支或者叶子结点。在图4中,分支结点只指向叶子结点。左侧分支结点中第一个结点项包含和最左侧叶结点最大项一样的key值和一个结点指向他,第二个包含下一个叶子结点最大项和一个指向他的结点。第三个只包含一个指向下层叶结点的指针。随着索引的增长,第三索引项能在索引生命周期内包含真实key值。
图4 分支结点
待续……