B树:
原则:一个m阶的B树(Balance Tree)具有如下几个特征:
- 1、根结点至少有两个子女。
- 2、每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
- 3、每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
- 4、所有的叶子结点都位于同一层。
- 5、每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
优势:
- 存放同样多的元素时,树的高度变小了,相当于减少了磁盘IO次数,提升性能
- 当查询进入了一个有很多元素的节点时,也只是存在于内存中进行比较,相对于磁盘IO的速度来说,消耗的时间可以忽略不计【这也是为什么在节点上进行“扩容”】
劣势:
- 相对于B+树来说,每个节点都会存数据,同样大小的磁盘页存的节点元素会少些
- 查询性能不稳定,比如有时可能会查到底层的叶子节点,有时可能查到最上层的根节点就返回了,每次查询的消耗不稳定,查询耗时波动大。
- 范围查询不方便,比如图中我要查询符合6~10的所有元素,而6~10的元素从根节点开始就分布在2侧的树中,所以需要经过的中序遍历非常繁杂
m阶的B+树独有特征:
- 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
- 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。