B树
一个结点要存下个子结点的指针、选择做索引的那列属性值、其他属性值
B+树
一个结点要存下个子结点的指针、选择做索引的那列属性值
叶结点存选择做索引的那列属性值和其他属性值
最后一层是链表连接
1、同等数据量时,B+Tree 的查询效率比 B-Tree 高,由于 B+Tree 的非叶子节点只存储 key 信息,而 B-Tree 的节点存储了 key + data,而每个页(一个节点)的大小是固定的,所以 B+Tree 的树高会更低一些
(我理解就是b+树的倒数第二层的每一个结点的选择做索引的那列属性值是这个结点的子树的选择做索引的那列属性值的最大值,所以B+树将很多结点都放在了最后一层,但是B树没有这样,每一层比较均匀,所以B+能压缩高度)
2、范围查询时,B+Tree 的效率远远高于 B-Tree,由于 B+Tree 的叶子节点存储了所有 key+data 信息,而且叶子节点之间有链指针,所有查询的时候 B+Tree 只需要找到 key 然后沿着链表遍历就可以了,而 B-Tree就需要一遍遍的从根节点开始查找(这就是链表的好处)
3、稳定性优化——B树的关键字分布在整颗树中,同一个关键字只会出现一次。B+树可能会出现多次,所有的叶子结点中包含了全部关键字的信息,B树搜索有可能在非叶子结点就结束搜索,而B+树必须搜索到叶子结点,但是锁定磁盘块指针消耗可以忽略不计;
(1.无论B树B+树,结点都是磁盘块,访问磁盘块数就是IO的次数,也就是访问结点次数就是IO次数。
2.对于访问一个指定数据,其IO次数就是对应数据的深度。
对于B+树,数据都是存在最后一层,IO次数固定就是树高
对于B树,数据存在在结点中,所以IO次数不固定
但是B+树层数比B树少,所以整体来看B+树的IO次数比B树少
3.对于访问指定范围的数据
对于B树,你每次只能访问一个数据,下一次访问要重头开始,这IO次数就太多了…
对于B+树,最后一层是链表,找到范围直接顺序访问即可)
转载:
https://blog.csdn.net/ywlmsm1224811/article/details/97890446
https://blog.csdn.net/John_D_B_Lee/article/details/119583528
https://blog.csdn.net/weixin_41751625/article/details/108171778