20191126 B+tree数据结构

查询速度更快,查询更稳定。

关键字:索引字段的值信息,左闭合区间原则。

 

二叉树

数据结构中的二叉树;树是一种一对多的数据结构。树又有很多子集,比如:二叉树、二叉搜索树、2-3树、红黑树等等。

树的特征:

1.没有父结点的结点叫根(根结点),一个数有且只有一个根;

2.每个结点有0个或多个子结点;

3.一颗树里也可拥有子树,且子树不能相交;

(根结点,子结点,叶子结点,子树)

 

每个结点拥有的子树数量称为该结点的度(直接子节点,不能间接),简单的说结点的子节点个数就是它的度。例如上图中D结点的度为3。度为0的结点成为叶节点,也就是没有子结点的结点`。

 

二叉树

二叉树的特征:

1.每个结点最多有2个子结点的树(就是不存在度大于2的结点);

2.左右子树有一定顺序(比如升序或降序,如下图中8的右子结点大于左子节点,结点2和7的子节点也是如此关系)。(左右子结点之间有一定的顺序关系,左侧的小于右侧的)

二叉树:简单地理解,满足以下两个条件的树就是二叉树:本身是有序树;树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

二叉树具有以下几个性质:

1、二叉树中,第 i 层最多有 2i-1 个结点。

2、如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。

 

满二叉树

满二叉树是所有非叶结点的子结点个数都为2,看起来呈水平对称。其特征为:

1.所有叶结点都在最后一层;

2.非叶结点的所有结点的度都为2;

 

二叉树的顺序存储结构

二叉树的存储结构有两种,分别为顺序存储和链式存储。本节先介绍二叉树的顺序存储结构。

 

采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储即可。

采用链式存储二叉树时,其节点结构由 3 部分构成(如下图所示):

1、指向左孩子节点的指针(Lchild); 数据域+指针。

2、节点存储的数据(data);

3、指向右孩子节点的指针(Rchild);

 

二叉树先序遍历

二叉树先序遍历的实现思想是:

  1. 访问根节点;
  2. 访问当前节点的左子树;
  3. 若当前节点无左子树,则访问当前节点的右子树;

 

前序遍历,也叫先根遍历,遍历的顺序是,根,左子树,右子树

遍历结果:A,B,E,F,C,G

中序遍历,也叫中根遍历,顺序是 左子树,根,右子树

遍历结果:E,B,F,A,G,C

后序遍历,也叫后根遍历,遍历顺序,左子树,右子树,根

遍历结果:E,F,B,G,C,A

 

平衡二叉树

B Tree指的是平衡树,平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构。

平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;

非叶子节点只能允许最多两个子节点存在,每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里值是基于自己的算法规则而定的,比如hash值);

子结点,根结点,子结点。 最后一个结点为叶子结点。

1)左侧的子节点小于当前结点的值;

2)右侧的子节点大于当前结点的值。

保证数据平衡的情况下查找数据的速度近于二分法查找;

 

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。

1、B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加;子节点不保存指针。

2、B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大排列;

3、B+树的根节点关键字数量和其子节点个数相等;

4、B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;

5、在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定;

 

explain select id from p_hospital where id<10 范围查找会走索引

树形结构是计算机系统里最重要的数据结构。

B+树是B树的变种,它在每个子节点里都只存放关键字信息,而只在叶子节点中存放存储所需的其它附属信息,这样就可以让子节点的分支因子最大化,也让树的高度尽可能的低。

子结点,叶子结点,降低树的高度。

B+树的创造者 Rudolf Bayer 没有解释B代表什么。最常见的观点是B代表平衡(balanced)。

B树,平衡树,平衡二叉树。

B+TREE中,数据检索规则采用的是左闭合区间,路数和关键个数关系为1比1,具体如下图所示:

 

B TREE和B+TREE区别是什么?

1、B+TREE 关键字的搜索采用的是左闭合区间,之所以采用左闭合区间是因为他要最好的去支持自增id,这也是mysql的设计初衷。即,如果id = 1命中,会继续往下查找,直到找到叶子节点中的1。

2、B+TREE 根节点和支节点没有数据区,关键字对应的数据只保存在叶子节点中。即只有叶子节点中的关键字数据区才会保存真正的数据内容或者是内容的地址。

 

MYSQL为什么最终要去选择B+TREE?

1、B+TREE是B TREE的变种,B TREE能解决的问题,B+TREE也能够解决(降低树的高度,增大节点存储数据量)

2、B+TREE扫库和扫表能力更强,如果我们要根据索引去进行数据表的扫描,对B TREE进行扫描,需要把整棵树遍历一遍,而B+TREE只需要遍历他的所有叶子节点即可(叶子节点之间有引用)。

3、B+TREE磁盘读写能力更强,他的根节点和支节点不保存数据区,所有根节点和支节点同样大小的情况下,保存的关键字要比B TREE要多。而叶子节点不保存子节点引用。所以,B+TREE读写一次磁盘加载的关键字比B TREE更多。

4、B+TREE排序能力更强,如上面的图中可以看出,B+TREE天然具有排序功能。

5、B+TREE查询效率更加稳定,每次查询数据,查询IO次数一定是稳定的。当然这个每个人的理解都不同,因为在B TREE如果根节点命中直接返回,确实效率更高。

 

数据以主键进行聚集存储,把真正的数据保存在叶子节点中。innodb设计初衷认为主键才是最主要的索引。

如上图中,叶子节点的数据区保存的就是真实的数据,在通过索引进行检索的时候,命中叶子节点,就可以直接从叶子节点中取出行数据。

主键索引的叶子节点保存的是真正的数据。而辅助索引叶子节点的数据区保存的是主键索引关键字的值。

搜索过程为:假如要查询name = seven的数据,先在辅助索引中查询最后找到主键id = 101,再在主键索引中搜索id为101的数据,最终在主键索引的叶子节点中获取到真正的数据。所以通过辅助索引进行检索,需要检索两次索引。

 

 

 

### 回答1: B树(B-tree)是一种自平衡的搜索树数据结构,适用于存储大量有序的数据,常用于数据库和文件系统中。B树可以高效地支持插入、删除和查找操作。 B树的结构特点如下: 1. 每个节点可以存储多个关键字,且关键字按照升序排列。 2. 所有叶子节点在同一层上,且通过指针连接起来。 3. 除根节点外,每个节点的关键字个数满足:[ceil(m/2)-1, m-1],其中m为节点的最大关键字个数。 4. 每个非叶子节点的关键字个数比其子节点的个数少1。 B树的操作如下: 1. 查找:从根节点开始,在每个节点中查找目标关键字,直到找到或到达叶子节点。 2. 插入:首先查找到插入位置对应的叶子节点,如果该叶子节点未满,则直接插入。如果该叶子节点已满,则进行节点分裂操作,将中间关键字上移,并为其父节点创建一个新的子节点。 3. 删除:首先查找到要删除的目标关键字位置对应的叶子节点。如果该叶子节点中存在该关键字,则直接删除。如果该叶子节点不存在该关键字,则进行节点合并操作,将其兄弟节点中的一个关键字拿来替换,并更新相关指针。 4. 节点合并和分裂:当一个节点满时需要进行节点分裂操作,将中间关键字上传并创建新的节点。当一个节点的关键字个数小于[ceil(m/2)-1]时需要进行节点合并操作,将其与相邻节点合并。 B树相较于二叉搜索树(BST)的优势在于: 1. 减少了平衡操作的次数,提高了插入、删除和查找操作的效率。 2. 可以存储更多的关键字,减少了内存开销。 3. 更适用于在磁盘上存储数据,因为B树每个节点可以存储更多的关键字,减少了磁盘IO次数。 总之,B树是一种高效的自平衡搜索树数据结构,适用于存储大量有序数据,特别是在数据库和文件系统中的应用广泛。 ### 回答2: B树(B-tree)是一种自平衡的搜索树数据结构,也是一种多路搜索树。它能够在 O(log N) 时间复杂度内进行搜索、插入和删除操作,具有高效的查找性能。B树常用于文件系统以及数据库管理系统中,用于存储和管理大量的有序数据。 B树的特点在于: 1. 每个节点可以拥有多个子节点,称为多路搜索树。通过拥有更多的子节点,B树能够存储更多的数据,减少树的高度。 2. 节点内的数据按照升序排列,并且节点的子节点的值范围也有序,可以通过二分查找进行快速定位。 3. 所有叶子节点都位于相同的层级上,没有指向其他节点的指针,提高了访问叶子节点的效率。 4. B树的平衡性是通过定义一个最小度数来保证。最小度数 t 确定了一个节点最少需要拥有 t-1 个键和 t 个子节点。 B树的插入和删除操作: 1. 插入操作:首先进行搜索找到插入位置,如果节点不满,直接将键插入到节点中;若节点满了,则需要进行节点分裂操作,将中间键上升到父节点中,同时分裂成两个节点。 2. 删除操作:首先进行搜索找到要删除的键。如果要删除的键在叶子节点上,直接删除;若在非叶子节点上,则需要查找其后继节点或前驱节点来替换删除的键。若删除后节点的关键字数小于最小度数,则进行合并或者重新分配。 总结起来,B树通过多路搜索、平衡性和节点分裂合并操作,提供了高效的数据存储与搜索方法。它在处理大量有序数据时具有很好的性能,并且被广泛应用于许多存储和数据库系统中。 ### 回答3: B-树(B-Tree)是一种平衡的多叉树,用于存储和管理大量的数据元素。它是一种自平衡的数据结构,可以高效地支持插入、删除和查找操作。B-树在数据库领域应用广泛,尤其适用于文件系统和数据库索引的实现。 B-树的特点包括: 1. 多叉:每个节点可以有多个子节点,相比于二叉树,B-树的宽度更大。 2. 自平衡:B-树通过保持其高度相对较小而保持平衡。在插入和删除操作中,B-树会通过旋转和分裂节点等操作来维持平衡。 3. 顺序访问:B-树节点中的数据元素是按照顺序排列的,使得范围查询操作更高效。 4. 多层级:B-树是多层级的,更适合大规模数据的存储和查询。 B-树的应用场景包括: 1. 数据库索引:B-树被广泛用于实现数据库的索引结构。它可以加速数据库中数据的查找操作。 2. 文件系统:B-树也可以用于文件系统中的文件索引,提供高效的文件访问能力。 3. 磁盘存储:由于B-树可以减少磁盘I/O操作的次数,因此在大规模存储中应用广泛。 4. 并发控制:在多用户环境下,B-树可以有效地进行并发控制,提供高性能的数据访问。 总之,B-树是一种高效、自平衡的多叉树数据结构。它通过调整节点的旋转和分裂,保持树的平衡性,并且提供高效的数据存储和访问能力。在大规模的数据库和文件系统中,B-树是一种非常重要的数据结构,它可以提高数据的查询和访问效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值