B-tree是什么
B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree)一个节点可以拥有2个以上的子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。B树减少定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上。
1.B-tree数据结构图
B-tree定义
一种多维度的,构建方式是从下而上的平衡树。
B-tree性质
前提:一个 m 阶的B树
1.每一个节点最多有 m 个子节点
2.每一个非叶子节点(除根节点)子节点数范围 ⌈m/2,m⌉ (ps:小数情况m/2的值向下取整)
3.如果根节点不是叶子节点,那么它至少有两个子节点
4.有 n个子节点的非叶子节点拥有 n− 1 个键 (ps:上图3阶树,共计2个数据关键词)
5.所有的叶子节点都在同一层 (ps:既根节点到每个叶子节点的路径相等)
PS:B-tree的阶是指B-tree节点的指针数目
B-tree特点
- B-tree是一种平衡树 [B-tree的自下而上的构建方式保证]
- 根节点至少有2个子节点
- 关键词数目等于n个子节点的数目减一,因为Btree的结构是2个子节点夹一个关键词
- B-tree关键词排序,从左到右升序排列
B-tree查找遍历
假设查找关键词29,且使用先序遍历
- 比较关键字29在区间(17,35),找到Btree节点指针P2
- 比较关键字29在区间(26,30),找到Btree节点指针P2
- 根据P2指针找到磁盘块8,在磁盘块8中的关键字列表中找到关键字29
B-tree如何保证结构稳定平衡
B树的构建方式是自下而上的构建方式,二叉树和红黑树是自上而下的构建方式,B树这种构建方式好处在于树结构稳定平衡性很强,不容易发生树平衡。以mysql为案例,其开启16k的页缓存,当索引字段大小为8字节,如果树高为3,其支撑最大的索引数目为2048*2048*2048+2048*2048+2048 > 85亿。
B-tree总结
- B-tree为什么使用多阶?
多阶好处:
多阶的好处是降低树的高度,在查询的时候很快定位到目标数,多阶的设计也符合现在磁盘系统读取数据的方式,现在磁盘系统取数据不是取的目标数据,磁盘取数据按照页大小取所需要的磁盘物理单元,具体流程参考我以前文章[IO流程简介] ,B-tree的结构就是一种多阶的红黑树,这种设计使得树的平衡性好,且时间复杂度比较高效O(n)=logmN。
多阶坏处:
多阶坏处,实现难度大特别是B-tree的平衡部分。B-tree在平衡的时候可能整颗树都会导致再次平衡,如何做到高效的平衡?待研究
- B-tree的最佳遍历方案是先序遍历吗?
先序遍历
时间复杂度O(n)=logmN
中序遍历
时间复杂度O(n)= 待公式待推导
后续遍历
时间复杂度O(n)= 待公式待推导
直观感受是,先序遍历充分利用了B-tree的特性 及hash定位的高效,比其他遍历方式更高效。
B-tree代码实现
git实现地址【目前未实现,待更新】
参考文档