前言
在上一章节,咱们介绍了二叉树的演变过程,有兴趣的小伙伴可以先翻翻前一章节,今天继续进阶.
B-Tree
定义
多路查找树,和二叉树不同点在于,他是多路的,下面可以有多个子节点.
假设我们有一张只存用户id,以及用户姓名的用户表如下图
假设 是个三阶的B-Tree 在MySQL中,我们以主键Id为索引举例,在磁盘中数据排列可能就是这样的
是不是看起来和二叉树一样, 当我们再插入几条数据试试. 当我们插入 8 9 10 11 四条数据
我们root节点原本黄颜色的占位被主键8所填充,并且生成了一个索引大于8的右子树来存放数据
其中有几个特性
- 排序方式:按递增次序排列,遵循左边小,右边大的原则
- 黄颜色为待填充的数据(没有数据依然会占据空间),蓝颜色为已经填充的数据
- 在每一个节点上既存在索引,还存在索引对应的数据
优点
- 和二叉树对比的话能存更多的索引以及数据
- 减少了树的高度,减少了磁盘IO的次数,提升了查询性能
缺点
- 和B+Tree相比的话,由于节点既存储索引,又存储数据,那整个B-Tree索引占用的数据量就会很大
- 因为数据的存储特性,无法在范围查询或者区间查询做到很好的性能提升
B+Tree
定义
先来一张图,感受一下 和B-Tree的结构对比 数据结构演化网站
从图中可以看出区别
- B+Tree叶子节点数据有序相连类似链表结构的(好处是可以实现范围查询,不用大量的IO刷磁盘操作)
- 子节点索引和叶子节点有数据重复的情况,(这是因为所有的数据都只存在叶子节点中,子节点只存放索引,所以叶子节点有子节点索引的数据引用,用于查询真实数据)
总结
写到这里基本上没有了,你以为 B+Tree就这么点东西么? 其实他只是融合了前面我所有举例的数据结构的特性,
二叉树->平衡二叉树->B-Tree->B+Tree
每一步的演进过程就是整个B+Tree的特性,并且在MySQL的innoDB引擎中,索引结构就是基于B+Tree来实现的,掌握这些才能对后续索引的使用有一个完整的认知,后续会对MySQL的索引使用有单独的篇幅讲解.