参考文章:
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+树、聚集索引和二级索引的结构分析
https://www.cnblogs.com/yuanrw/p/10225659.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个子节点(,
为向上取整。);
(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)
n 为关键码的个数()。
(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+树有。