一、为什么需要B树?
用二叉查找树在磁盘上存储数据会面临两个问题:
1、二叉树只有两个分支,数据量非常大的时候,树的高度会很大,不利于数据的查找
2、每次仅若读取一条信息,会造成大量空间的浪费
因此需要把树的高度降低,并且尽量是的每次磁盘读取都能够得到最多的信息
为解决这两个问题,B树应运而生
B树是一种多路平衡树,或者说是一种平衡多路查找树,用于处理磁盘读取问题,减少磁盘IO次数。
B树构建过程:
总结:
1、当根节点已满的时候,要先对根节点进行拆分
2、如果根节点没满,要先走到叶子节点,如果叶子节点没满,则进行插入,如果已满,需要对叶子结点进行拆分。
二、有了B树为什么还需要B+树?
B+树是在B树的变种,它与B树的不同之处在于:
1、在B+树中,key的副本存储在内部节点,真正的key和data存储在叶子节点中
2、n个key值的节点指针域为n而不是n+1
三、B与B+树的区别:
1、B+树内节点不存储数据,所有data存储在叶子节点导致查询时见复杂度固定为logn,而B树查询时间复杂度不固定,与key在树中的位置有关,最好为O(1)
2、B+树叶子节点两两相连可大大增加区间访问性,可使用在范围查询等,而B树每个结点key和data在一起,则无法区间查找
3、B+树更适合外部存储,由于内节点无data域,每个节点能索引的范围更大更精确
4、在数据结构上,B树为有序数组+平衡多叉树,而B+树为有序数组链表+平衡多叉树
四、为什么MongoDB索引选择B树,而Mysql索引选择B+树?
MongoDB是一种nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合。符合区别的第一条,MongoDB是聚合型数据可,而B树恰好key和data域聚合在一起
Mysql是一种关系型数据库,区间访问是常见的一种情况,而B树不支持区间访问,而B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样很容易的进行区间遍历甚至全部遍历。