基于B树和B+树的使用:详细介绍了数据检索和数据库索引。

基于B树和B+树的使用:详细介绍了数据检索和数据库索引。
B-树

1、B树定义

B树是一种平衡的多路径查找树,在文件系统中非常有用。

定义:m阶B-树,或空树,或M叉树,它满足以下特性:
树中每个节点最多有m个子树;
他不是一个叶节点,至少有两个子树;

根节点外至少有两个{ 2 }树的所有非终端节点;
它包含所有非终端节点中的下列信息数据:

(n,A0,K1,A1,K2,……千牛,a)
其中:Ki(I = 1,2,n)是一个关键代码,和KI + KI + 1,

AI是一个指向一个孩子的根节点(i = 0,1,…,n)的所有节点的子树的关键码被指针AI-1小于Ki(i = 1,2,…,n)中的所有节点的子树的关键码超过kN。

n是键码的个数。
所有的叶子节点都处于同一层次,没有信息(可视为外部节点或无法找到节点,节点实际上不存在,指向节点的指针是空的)。

也就是说,所有的叶节点具有相同的深度,等于树的高度。

作为一个四阶B树,它的深度是4。

B树的搜索类似于二叉排序树的查找,这是在B树的每个节点是不同的关键码有序列表,到达一个节点,第一个在有序表的查找,如果找到,找到成功;否则,找到相应的点根据子树的指针信息在的时候,在叶节点,然后在关键没有相应的树。

在上面的图中搜索B树上关键字47的过程如下:

1)首先,我们从根节点指针中找到*节点,因为在一个节点中只有一个键,给定值为47 >关键字35。如果存在,则必须在指针A1所引用的子树中。

2)如果有一个在指针A1中引用的子树,则由独联体指针发现*节点,它有两个关键字(43和78)和43 < 47 < 78。

3)也可以通过CIS指针找到g节点,在节点上找到关键字关键字47,并找到成功的关键字。

2。查找算法
复制代码代码如下所示:
Typedef int KeyType;
#的顺序定义M 5 / * B树暂时设置5× /
Typedef struct Node {
国际keynum;节点中的一批重点 /,节点的大小。
结构节点*父节点;指向父节点
关键字项{ m + 1 }; / *关键代码的载体,0号机组不* /
结点指针ptr { m + 1 }; / * * /子树指针向量
记录* recptr { m + 1 }; / * * /向量记录指针
}节点类型; / * B树的节点类型。

typedef struct {
节点类型*铂; / * * /查找节点
节点中的键号、节点号间隔{…1…
int标记1:0:查找成功,未找到。
}结果。

结果searchbtree(节点类型* T值KX)
{
/ *找到关键代码KX在m阶B树T,背(PT、我、标签),如果搜索成功,那么标签= 1的特征值。
PT是指KX指针/我关键代码等于节点;否则,标签= 0的值,x等于记录键。
在指针PT中的一个关键节点中,应该在方法和i/I + 1之间插入。
p = T;q = NULL;查找= false;i = 0;初始化,指向未知节点,q指向P的父节点。
而(P!发现)
{ n = p > keynum;我=搜索(P,KX); / * P -->关键{ 1 }…keynum找到。
如果(我0p ->关键{我} = = KX发现= true); / * * /找到
别的{ Q = P;P = P>PTR {我};}
}
如果(返回)返回(p,i,1);* / 查找成功
否则返回(Q,我,0); / *找到成功回KX位置信息插入。
}

B树查找算法分析

从查找算法中可以看出,B树中的搜索包含两个基本操作

(1)找到B树中的节点;

(2)找到节点中的键。

B树存储在磁盘上,以前的搜索操作的磁盘上进行,然后搜索操作在内存中进行的,这是发现在磁盘上的P指针指的节点,第一个节点信息读入内存,然后使用顺序查找或二进制搜索查询等于K关键词。显然,这需要更多的时间来对磁盘做查找比在内存中执行查找。

因此,磁盘上的查找数,B树上的层次树,是决定B树搜索效率的主要因素。

那么,m阶B树的n个键码最坏的情况有多深呢根据两叉平衡树进行相似分析,首先讨论m阶B数各层上的最小节点数。

B树定义:B树包含n个关键字,所以J + 1层中有n + 1个叶子。

1)第一层是根,至少有一个节点,根至少有两个孩子,所以二楼至少有两个节点。

2)根和叶子,其他节点至少有2个{ } 2个孩子,所以第三层至少有2个 2个}节点,在第四层中至少有2×2个节点…

3)然后至少有2×{ M / 2 } J-1节点J + 1层,和J + 1层节点是叶节点,所以叶子节点数为n + 1。是uff1a
也就是说,在n关键字的B树中,节点从根节点到关键字所涉及的节点数不超过:

3 b树的插入

B树是从空树生成和插入一个又一个。但由于在B的一些关键节点树必须大于或等于细胞(M / 2)1,因此,每一次一个关键词的插入是不添加树中的一个叶节点,但在一个非终端节点的最低层添加关键词,关键词如果节点数小于1插入,完成,或生成节点分裂,

作为(a)是顺序的B树(图中的F节点(即叶节点)),假定关键字应按30, 26, 85的顺序插入。

1)首先确定通过查找插入位置。抬头从根*确定30应插在* D节点。因为* D的关键词数量不超过2(m-1),插入第一关键词:(B)
2)同样,通过搜索来确定关键词26还应插入*因为* D节点超过2个关键词的数量,这会需要被拆分成两个节点和26个关键词前后两指针停留在* D节点和关键37前后两指针存储节点* D `产生新的。同时,指针30和指示节点* D `插入父母节点的指针,因为在* B节点的关键词数量不超过2个,插入完毕。例如,(c)(d)
3)(e)-(g)插入85后;

插入算法:
复制代码代码如下所示:
Int InserBTree(节点类型* T值KX,节点类型* Q,int i){
/ *结在m阶B * T * q键{我}树,关键{我+ 1 }插入钥匙KX *之间/
如果节点太大原因,沿着父节点分裂调整的链,t仍然是m阶B树。
X = KX;AP = null;成品= false;
当(q)!完成)
{
插入(Q,我,X,AP); / * x和AP分别为Q—>关键{我+ 1 }和Q -> PTR {我+ 1 } * /
如果(Q>keynum<m)完成= true; / * * /插入完成
其他的
{拆分节点*
s=2;拆分(q,AP);
/ * Q—>关键{ 1 } +…M,Q>PTR { S. M }和Q -> recptr { + 1…米}移动到新的节点* * /美联社
q =父>父;
如果(Q)=搜索(Q,KX);在*问KX插入位置的父节点发现 / *。
}
}
如果(完成了)*(*)是一个中空树或根节点已经分裂成* *和AP *
NewRoot(T、Q、X,AP); / *代信息(t,x,AP)的新的根节点* t,原* T和AP的子树指针* /
}

4。B树缺失
另一方面,如果你删除B关键字树,首先要找到关键节点,然后取出,如果节点是最低的非终端节点,和关键词不低于细胞数(M / 2),删除或合并节点操作。如果删除关键字Ki在非终端节点的子树的指针最小的关键词AI可以取代基,然后Y在相应的节点删除。例如,45在B删除下图4.1树(一),50 * F节点可以取代45,然后50是在* F节点删除。

图4.1(a)

因此,我们只能讨论在最低的非终端节点中删除关键字的情况。有三种可能性:

(1)删除关键的关键字的节点不小于细胞(M / 2),只是从节点删除Ki关键字和对应指针的AI,不变,例如树的其他部分,从图4.1(a)所示的B树的删除键12,删除B树像Tutu 4.2(a)显示

图4.2(a)

(2)删除关键的一些关键节点等于细胞(M / 2)1,与相邻的节点(左或右的弟弟)在超过细胞的关键节点数(M / 2)1,必须在最小的兄弟姐妹(或最大)关键在但父节点,将小于父节点(或更大)和接近移关键词移动到删除的关键节点。

{ }为例,从图4.2(a)50至61将被删除,移动到右兄弟的* * E E节点,节点在53到F,使F和G关键词* *数分别不低于细胞(M-1)- 1,和在同一个父节点Tutu一些关键词,如图4.2(b)。
图4.2(b)

(3)一些关键词在节点删除的关键所在及邻近兄弟等于细胞(M / 2)-1.if节点有右兄弟,右兄弟地址指针中的父节点的AI,删除关键字,剩下的在关键节点和指针,加上关键字Ki的父节点,合并到AI指的是兄弟姐妹(如果没有合适的哥哥,然后合并到左兄弟姐妹)。

{例如,如果删除53从B图4.2所示的树(B),我们应该删除*和* F F节点合并剩余信息(指针为空)和61母* E节点的兄弟节点*权为删除树如图4.2所示(C)。
图4.2(c)

如果在父节点的键的数目小于ceil(m / 2)1,然后依次是类似的。

{例如,在删除图4.2(c)的B树中的关键字37之后,父B节点(指针C)中的剩余信息应与父节点的密钥45合并到右兄弟节点e,并且删除的B树如图4.2(d)所示。
图4.2(d)
B树主要用于文件系统中。
以大型数据库文件存储在硬盘上以减少磁盘访问次数的一个平衡多路搜索树B树结构的性能分析,检索效率很高,为了提高改性B树和许多种类的B -这里的目的树的性能,试图提高B树
B+树B+树是由文件系统生成的B树的可变形树,m阶的B+树和m阶的B树。
不同之处在于:
具有包含n个子树节点的密钥代码;
所有叶节点都包含所有关键信息,并包含这些关键指针代码记录,以及
叶子节点本身根据密钥代码的大小以一个小的和大的顺序链接在一起。
所有非终端节点都可以看作是索引,节点只包含子树节点中的最大(或最小)密钥。

例如,一个3阶B+树:
通常在B+树上有两个指针,一个指向根节点,另一个指向叶的最小键,所以在B+树上可以执行两种查找操作:一种是从最小的键搜索,另一种是从根节点开始进行随机查找。
在B+树上随机搜索、插入和删除的过程基本上类似于B树,只有在查找过程中,如果终端节点上的关键代码等于给定值,它不会终止,而是继续向下到叶节点。
树,不管搜索成功与否,每个搜索都是从根到叶节点的路径。

B+树在数据库中的应用

1的作用。数据库中的索引

在使用数据库系统的过程中,数据查询是最常用的数据操作之一。

最基本的查询算法,当然,顺序查找(线性搜索),遍历表,然后按行匹配的行是否值等于关键进行搜索,其时间复杂度为O(n),但时间复杂度O(n)算法的表规模小、负载轻的数据库,也可以有很好的性能,但是当数据增加的O(n)算法的时间复杂度显然是坏的,和性能迅速下降。

幸运的是,计算机科学的发展提供了许多优秀的搜索算法,如二点查找(Binary Search)和二叉树查找(二进制树搜索)。如果稍加分析就会发现,每一个搜索算法只能应用于特定的数据结构,如两个搜索请求被命令检索数据,而二叉树搜索只适用于两树,但是数据本身的组织结构不能完全满足各种数据结构(例如,同时理论不能为两列来组织),所以,除了数据,数据库系统也保持以满足特定的数据结构的搜索算法,以某种方式的数据结构参考(指向)数据,可以在这些数据结构上实现高级搜索算法。这个数据结构是索引。

一个指标是排序的数据库表中的一个或多个列的值的结构,表中的所有行进行比较,参考指针指向存储在指定的列的表的数据值的指针,然后根据指定的顺序排列,这有助于获得信息的速度更快。通常,只有当索引中的列的数据经常被质疑,有必要创建一个表的索引,索引会占用磁盘空间影响数据更新的速度。但在大多数情况下,数据检索的索引带来的速度远远超过其缺点。
2应用。数据库索引中的B+树
目前,大多数数据库系统和文件系统使用B-Tree或其变种的B+树索引结构

1)数据库索引的应用

在数据库索引的应用中,B+树是按以下方式组织的:

对叶子节点结构。一个B+树的查找密钥是一个数据文件和索引是密集的关键。也就是说,第一个叶节点记录为数据文件提供一个密钥和一个指向数据文件,根据主键,也可以根据原始数据文件进行排序;根据主键和B+树是稀疏索引,每一个数据块的数据文件中的叶节点设置键和一个指向数据文件;关键属性分类、属性查找键的B +树,每个叶节点属性K数据文件出现一个关键,一个指针的指针,排序第一的记录关键的K。

(2)非叶节点的组织。非在B+树的叶节点上形成多级稀疏索引的叶节点,每个非叶子节点至少有细胞(M / 2)指针,最多有m个指针。
2)B+树索引的插入和删除
(1)在数据库中插入新数据,并在数据库索引中插入相应的索引键时,需要将新的键值插入到B+树中,即上面提到的B树插入算法。
当从数据库中删除数据时,还需要从数据库索引中删除相应的索引键值,并且需要删除B+树删除树算法中的键值。

为什么使用B树(B+树)

两叉查找树、进化树、红黑树的数据结构也可用于索引,而文件系统和数据库系统一般采用B+树作为索引结构。

总的来说,指数本身也大,不能存储在所有的记忆中,所以索引通常存储在一个索引文件的磁盘的形式。在这种情况下,索引查找的过程中会产生磁盘I / O消耗,相比于内存访问,我 / O访问几个数量级的高消费,所以一个数据结构的评价作为最重要指标的质量指标是我的I/O操作次数的渐进复杂的搜索过程中磁盘。换句话说,该指数的结构是为了最大限度地减少磁盘I /在搜索过程中访问O。为什么用B - / +树也是对磁盘访问的相关原理。

局部性原理和磁盘预取

由于存储介质的特性,磁盘本身比主存慢得多。随着机械运动的成本,磁盘访问速度始终是主存的几百个点。因此,为了提高效率,我们应该尽量减少磁盘I /组织为实现这一目标,磁盘往往不严格按照需要阅读,但每只需要阅读甚至字节磁盘也会从这个位置开始,以读取一定长度的数据记忆。这个理论基础是计算机科学中著名的局部性原理。

当使用数据时,通常会立即使用附近的数据。

程序运行期间所需的数据通常比较集中。

由于磁盘读写效率高(不需要查找时间,只需要一点时间,那么旋转时间),可以提高I/O预取的效率。

按照一般的页面(页面)的整数。网页是一个逻辑块计算机内存管理硬件操作系统的内存和磁盘存储区划分为大小相等的连续的块,每个存储块称为一页(在操作系统中,多页的大小通常是4K),主存储器和磁盘以页为单位进行数据交换。当程序在内存中读取数据,触发页面错误,系统将一个信号读取磁盘,磁盘将找到起始位置数据和反向顺序读取页面或页面加载到内存中,然后返回异常,程序运行。

我们分析了B + +树检索最需要的访问节点一次:

= h
该数据库系统巧妙地利用了一个磁盘读取的原理,使节点的大小等于一个页面,使每个节点只需要一个I/O即可完全加载,为了实现这一目标,需要在B树的实际实现中使用以下技术:

每次建立新节点时,都直接应用页面的空间。这样可以确保一个节点物理地存储在一个页面中,并且计算机存储和分发都是按页对齐的。它一次实现一个带有I/O的节点。

在B树一个检索要求最大的H-1次我 / O(根节点的永久记忆),并逐渐复杂度为O(h)= O(logmN)。在一般的应用中,M是一个非常大的数字,通常超过100,所以H很小(一般不超过3)。

综上所述,采用B树作为索引结构的效率是很高的。

和红黑树的结构,H明显更深。因为逻辑关闭节点(父与子)可以从物理距离太远了,用的地方,我 /红黑树O渐进复杂度为O(h),这是比B更有效。MySQL的B树索引(技术上的B+树)

在MySQL数据库中,有四种主要类型:索引B树索引,Hash索引,全文索引,R树索引。主要分析B树索引。

B树索引是最常用的MySQL数据库中的索引类型。除了档案存储引擎支持B-树索引的所有其他存储引擎。档案引擎不支持索引到MySQL 5.1,只支持单auto_increment列索引。

不仅在MySQL数据库中,但在许多其他的数据库管理系统,B树索引是最重要的指数型。这主要是因为B-Tree索引的存储结构在数据库的数据检索性能优良。

一般来说,物理文件的B树索引在MySQL存储在平衡树,它是所有实际的数据需要存储在树的叶子节点(叶节点)、最短路径和任何叶节点的长度是完全相同的,所以我们称为B-树索引。当然,这是可能的各种数据库(或MySQL的各种存储引擎)将改变存储结构略当他们自身储存的B树索引B树索引。如InnoDB存储引擎的存储结构,实际使用的是B+树,是树的数据结构的基础上进行改造是非常小的,在存储在索引键每个叶节点的相关信息,还存储了一片叶子的指针信息(增加顺序访问指针之后)对叶子和相邻节点的节点,这主要是为了加快多个相邻叶节点的检索效率。

以下是对MyISAM和InnoDB存储引擎的索引实现两主要讨论:1。MyISAM索引实现:

1)主键索引:

MyISAM引擎使用B+树索引结构,和叶节点的数据域中存放的是数据记录的地址。下图是MyISAM主键索引图。

(图myisam1)

该表有三列,假设我们使用col1为主键,和图myisam1为MyISAM表的主索引(主键)。可以看出,MyISAM索引文件只保存数据记录的地址。

2)辅助索引(辅助关键字)

在MyISAM,有主要指标和辅助指标无差异(次重点)结构。只有主要指标需要密钥是唯一的,而辅助索引键可以重复。如果我们建立一个辅助指标COL2,索引的结构如下图所示:

这也是一个B+树,和数据域保存数据记录的地址。因此,根据B +树搜索算法首先搜索索引检索算法的表。如果指定的键存在,则删除数据域的值,然后以数据域的值作为地址读取相应的数据记录。

MyISAM的索引方法,又称非聚合,即区别于InnoDB的聚集索引。2。InnoDB索引实现

但InnoDB也使用B+树索引结构,但具体的实施是从MyISAM截然不同。

1)主键索引:

MyISAM索引文件与数据文件分开,和索引文件只保存数据记录的地址。在InnoDB表数据文件,本身就是一种索引结构的B+树的组织,和树的叶节点的数据域保留一个完整的数据记录。该指标是关键数据表的主键,那么InnoDB表数据文件本身的主要指标。
(图inndb主要关键指标)

(图inndb)的主要指标是一个InnoDB主要指标示意图(和数据文件)。可以看出,叶节点包含一个完整的数据记录。该指数被称为聚集索引,因为InnoDB数据文件本身根据初级聚集,那么InnoDB要求表必须有主键(MyISAM不能),如果没有明确指定,那么系统会自动选择MySQL作为一个主要的钥匙可以唯一标识的数据记录,如果没有这样的栏目,MySQL会自动生成一个隐藏的InnoDB表作为主键字段,这个字段是6字节长,长整数型。

2)。InnoDB的辅助指标

所有的InnoDB辅助指标是主键的数据域。例如,下面的数字是指在col3辅助指标:
InnoDB表是基于聚类的指标。因此,InnoDB索引可以提供非常快速的主键查找性能。然而,其辅助指标(二级指标,即非主键索引)也包含主键列,所以如果主键定义为大,其他指标也大。如果你想定义在表的一些指标,尝试定义的主要关键possible.innodb不压缩指数小。
文本的字符的ASCII码作为比较标准。聚簇索引的实现使得基于非常有效的主键搜索,但辅助索引搜索需要检索的两个指标:第一,检索辅助索引来获得主键,然后检索与主索引主键的记录。

不同的存储引擎指数为指标的正确使用和优化是非常有帮助的,比如,知道InnoDB索引,很容易明白为什么不建议使用长字段作为主键,因为所有的次要指标参考的主要指标,主要指标太长会使次级指数变得太大。例如,在非单调的领域在InnoDB的主键是不是一个好主意,因为InnoDB数据文件本身是一个B+树,非单调的主键将导致数据文件插入为新纪录保持B+树的分裂和频繁调整,的特点,效率很低,使用增量字段作为主键是一个不错的选择。

InnoDB索引和MyISAM索引的区别:

一是主要指标和InnoDB数据之间的差异文件本身是索引文件。对MyISAM索引和数据分离。
二是辅助索引的区别:InnoDB的辅助索引的数据域存储相应的主键的值而不是地址,MyISAM的辅助指标不从主要指数不同。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部