B+树和B*树

B+树和B*树


一、B+树的简单介绍

B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又在B树的基础上做了以下几点改进优化:
分支节点的子树指针与关键字个数相同
分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间
所有叶子节点增加一个链接指针链接在一起
所有关键字及其映射数据都在叶子节点出现

B+树的特性:

  1. 所有关键字都出现在叶子节点的链表中,且链表中的节点都是有序的。
  2. 不可能在分支节点中命中。
  3. 分支节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层。

二、B+树的插入过程

三、B*树的简单介绍

B*树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。

B*树的分裂

当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。

四、B树、B+树、B*树总结

B树:有序数组+平衡多叉树;
B+树:有序数组链表+平衡多叉树;
B*树:一棵更丰满的,空间利用率更高的B+树。

五、B树的应用

1、MyISAM索引实现

思考一个问题,我们按照stuID查找快还是name查找更快?

答案肯定是stuID更快,因为这个是主索引,直接使用B+树本身的搜索能够搜索到了,而用name查找的话要暴力遍历B+树的所有叶子结点去找地址后到表中查找。

如果找不到主建的话,就用一个自增的整数做主建(自增主建)~~

2、InnoDB索引实现

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。

这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

相关推荐
阿猿收手吧!6 小时前
【数据结构】高效掌握并查集:核心原理与实战
数据结构·算法
shehuiyuelaiyuehao7 小时前
23七大排序算法
数据结构·算法·排序算法
wangluoqi7 小时前
c++ 数据结构-单调栈、单调队列 小总结
jvm·数据结构
ValhallaCoder7 小时前
hot100-图论
数据结构·python·算法·图论
小龙报7 小时前
【51单片机】51 单片机 IIC 协议深度解析:时序实现 + GXHT3L 连续转换模式 + 数据解析
c语言·数据结构·stm32·单片机·嵌入式硬件·物联网·51单片机
Eloudy7 小时前
动态库中不透明数据结构的设计要点总结
数据结构·设计模式
重生之后端学习7 小时前
108. 将有序数组转换为二叉搜索树
数据结构·算法·深度优先
2013编程爱好者17 小时前
【C++】树的基础
数据结构·二叉树··二叉树的遍历
NEXT0617 小时前
二叉搜索树(BST)
前端·数据结构·面试
化学在逃硬闯CS17 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法