MySQL_基础结构_B(B-)/B+ 树

 

参考文章:

1.B+树总结

https://www.jianshu.com/p/71700a464e97

 

2.B-Tree Hash b+Tree三种索引特点对比

https://blog.csdn.net/weixin_42540340/article/details/88835023

 

3.MySQL索引的原理,B+树、聚集索引和二级索引的结构分析

http://www.javashuo.com/article/p-bmewpzsg-ew.html

 

4.MySQL数据库中索引的数据结构是什么?(B树和B+树的区别)

https://www.cnblogs.com/linliquan/p/11364428.html

 

5.B树, B-树,B+树,和B*树的区别

https://www.cnblogs.com/itxiaok/p/9459716.html

 

 

  MySQL 的 Innodb 使用了 B+ 索引,说起 B+ 索引,那我们必须聊聊 B(B-) / B+ 数据结构,本篇对相关的数据结构 做一个大致的介绍。

 

树的一些基本概念

 

阶的概念

对于一棵m阶B-tree,每个结点至多可以拥有m个子结点。

即遍观整棵树,子节点最多的个数是m,那么这棵树就是m阶树。

 

 

 

B / B- 树

 

什么是 B / B- 树

B树(又叫平衡多路查找树) 注意B- 树就是B树,- 只是一个符号。中间的短线是英文连接符,只是翻译的时候将短线翻译成了减号。
B / B- 树 全称Balance-tree(平衡多路查找树)平衡的意思是左边和右边分布均匀。多路的意思是相对于二叉树而言的,二叉树就是二路查找树,查找时只有两条路,而B-tree有多条路,即父节点有多个子节点。

 

B / B- 树用途

使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。这个数据结构一般用于数据库的索引,综合效率较高。

 

B / B- 树的定义

(1)树中每个结点至多有m 棵子树(注:m指的是树的阶);

(2)若根结点不是叶子结点,则至少有两棵子树(注:根节点至少有两个儿子);

(3)除根结点之外的所有非叶子结点至少有p个子节点(\left \lceil m/2 \right \rceil\leqslant p\leqslant m, \left \lceil m/2 \right \rceil为向上取整。);

(4)所有的非叶子结点中包含以下数据:(n,A0,K1,A1,K2,…,Kn,An)

     其中:

     Ki(i=1,2,…,n)为关键码,且Ki<Ki+1(注:ki是真实数据,存放在线性表当中,且从左至右升序排列)

     Ai 为指向儿子的指针(i=0,1,…,n),且指针Ai-1 所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An 所指子树中所有结点的            关键码均大于Kn。(注:每个ki数据两旁各安放了一个指针,即Ai-1和Ai,左边的子树数据统统小于ki,右边子树的数据统             统大于ki)(注:总体来看指针数量比数据数量多1)

      为关键码的个数\left \lceil m/2 \right \rceil-1\leqslant n\leqslant m-1)。

(5)所有的叶子结点都出现在同一层次上,即所有叶节点具有相同的深度,等于树高度。并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。 

 

 

B+ 树

如上图所示 为一颗 B树,B 树 为 B / B -  树 的一种变体

 

 

B + 树定义

 

B + 树的定义 与 B / B - 树相同,除了以下几点 :

  (1)  非叶子结点的子树指针与关键字个数相同 。

  (2)  非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)。

  (3)  为所有叶子结点增加一个链指针  

  (4)  所有关键字都在叶子结点出现 。

 

B + 树特性

 

1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

 2.不可能在非叶子结点命中;

 3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

       

B + 树用途

  1.更适合文件索引系统;

   2.MySQL INNODB 引擎的索引

 

B / B-  树 与 B + 树的区别 


B+Tree相对于B-Tree有几点不同:

1. 非叶子节点只存储键值信息。

2. 所有叶子节点之间都有一个链指针。

3. 数据记录都存放在叶子节点中。

4.B树的节点中没有重复元素,B+树有。