https://www.cnblogs.com/nullzx/p/8729425.html
总结如下:
当数据量大时,我们如果用二叉树来存储的会导致树的高度太高,从而造成磁盘IO过于频繁,进而导致查询效率下降。因此采用B树来解决大数据存储的问题,很多数据库中都是采用B树或者B+树来进行存储的。其目的就是减少磁盘IO,提高查询效率。数据库大多用B+,那为什么是B+树而不是B树呢,因为它内节点不存储data,这样一个节点就可以存储更多的key。
B树(B-)
一颗m阶的B树定义如下:
1)每个结点最多有m-1个关键字。
2)根结点最少可以只有1个关键字。
3)非根结点至少有Math.ceil(m/2)-1个关键字。
4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
总结来说比较重要的就是:节点下的关键字个数必须在[m/2-1,m-1]
B树的插入:
主要检查插入到某一节点后该节点下的关键字是否超过了m-1,超过了就选中间的关键字作为key,然后将其上移到父节点,然后分为两个范围,接着检查父节点即做上面的重复动作
B树的删除:
如果是叶子节点直接删除
如果是非叶子节点,那么就将该节点删除,然后同时在该位置用继节点替换
以上两种情况均可能破坏B树的结构,当破坏是:
无非就是节点中的关键字小于了m/2-1啦,这时候就首先检查其左右兄弟,如果有一个兄弟是大于m/2-1的,那么就向兄弟节点借一个关键字到当前节点,具体做法就是,将要借的这个关键字上移到父节点,然后父节点给当前节点下移一个关键字
如果左右兄弟都是正好m/2-1,也就是说没有多余借给自己,那么就将父节点下移一个关键字和其兄弟以及自己组成一个新的孩子节点
B+树:
其和B树差不多,最大的区别就是所有数据都存在在叶子节点中,非叶子节点只是索引,然后其插入删除操作和B树思想基本一样,不过不同的是比如插入后需要分裂,我们是选取中间的关键字上升为父节点,然后其孩子节点时没有该关键字的,但是在B+树中,孩子节点还是要有的,上升的那个可以看做是仅仅增加了一个索引