B树定义
对于一颗M阶B树具有以下性质
1.根节点的子节点数为[2,M]。
2.除根节点与叶节点外的节点子节点数数为[M/2,M]。
3.除根节点每个节点都存放数据个数为[M/2-1,M-1],升序存储。
4.非叶节点存储数据个数为指向子节点指针数-1.
5.所有的叶节点都在同一层。
B树的使用场景
在数据存储中,AVL树与红黑树的查询时间都是相对低,但在大量数据存储时,往往不能一次性把全部数据都加载到内存当中,因此io次数是查询时间复杂度的决定性因素。对于二叉树来说存储大量数据二叉树的高度会非常高,数据会散列存放在不同的数据块中,在查找时加载数据的io次数就会增加。胖矮的树更能减少io次数,而B树的子节点数多于2,是多阶数,也称多路查找树,能把尽可能多的把相近的数据存放到同一个数据块中,同时降低数的高度,减小查询时间,因此B数适合大数据量存储。mogodb是一种聚合行模型简单的高性能数据库,使用了B树数据结构,将key与数据聚合到一起。
B树新增节点只在叶节点增加,B树增加节点时从根节点查询新节点插入的位置,插入节点后如果不违反性质3,则不需要维护。如果违反性质3,节点数超过M,则需要对节点进行拆分,对半拆成两个节点数基本相同的节点,将中间节点上移到父节点,如果父节点违反性质3,递归维护B树,直到符合B树性质或根节点拆分,生成新的根节点,B树的高度增加。由此拆分过程可知B树是一棵自平衡的平衡多叉树。
以下是一棵5阶树节点新增过程
B树的节点删除则如果违反性质3,需要从父节点下移数据,递归维护直到重新满足B树的全部性质或根节点下移与子节点合并,成为新的根节点,B树的高度降低。
B+树
B+树与B树区别在于B+树不是将数据存储到每个节点中,只存放用于区分范围的key值,具体数据存放在叶节点中。同时在叶节点新增一条顺链连指针。
B+树相对B树的优势:
由于B+树非叶节点不存储数据,因此非叶节点体积很小,一个数据块可以容纳更多的非叶节点,因此极大减少了io次数,查询时间更短。同时由于添加了叶节点间的指针链,因此在范围查找时只需要找到起点节点按链表查询下去,提高了范围查找的时间复杂度。
B+树的使用场景:
关系型数据库索引一般使用B+树