前面一片博文中我们知道, AVL树确实能中和链式存储结构和顺序存储结果的优缺点, 在添加和删除方面都能表现出优越的性能,这里我们 可以将B树理解成是平衡二叉树的升级版
B树不一定只有两个叉, 但是B树和二叉平衡树一样都是有序的, 即当我们按照中序遍历它树, 可以得到有序数列, 而且B树比AVL树更胖,更矮, ,因此树越高, IO次数就会越大,但是也带来了更多的优势, 每次在磁盘上读取数据时,都会进行一次预读, 使用B树可以很好的实现这个特性
AVL树的磁盘IO性能假设使用AVL树建立索引, 如上图, 索引文件不会被保存在内存中, (避免索引文件过大,导致内存的溢出), 于是我们如果想根据索引读取数据, 瓶颈就在每次读取索引文件和磁盘之间的IO上
假设我们有上面的树, 然后我们查询node10, 会和磁盘进行如下几次IO
第一次与磁盘的IO : 读取node4, 往右走
第二次与磁盘的IO : 读取node8, 往右走
第三次与磁盘的IO : 读取node9, 往右走
第四次与磁盘的IO : 定位 node10, 结束
虽然使用AVL树建立索引并不是最好的选择, 但是和全表扫描,进行10次IO相比, 效率还是很明显的高效
B树的磁盘IO性能同样我们想查询node10
第一次与磁盘的IO : 读取node4, 往右走
第二次与磁盘的IO : 读取node6,node8, 往右走
第三次与磁盘的IO : 读取node9,定位到node10
很明显,B树会比AVl树更矮, 当存储的数据超级庞大时, 它甚至可以比AVL树减少一半的IO次数
同样, B树的范围查询效率比较低
B+ 树概念: 在上树中, 只有最后一行叫做非叶子节点, 其他的都叫做叶子节点
B+树,是B树的一种变体,查询性能更好。
m阶的B+树的特征:
B+树的非叶子节点只用来存储索引信息,而不存储数据,(B树中每一个节点中会存储数据), 这样的会B+树就会在内存中建立庞大的索引体系, 使得他的检索速度超快
所有项链的叶子节点使用链表这种结构进行结合, 有先后的顺序, 从而使得它的范围查询效率很高
B+树相比于B树的查询优势:
B+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此B+树查找更稳定(并不慢);
对于范围查找来说,B+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历
缺点: 会用冗余的节点, 比较占硬盘的大小, (但是这些冗余的节点都是索引,会大大提高查询速度)