什么是B树?
B树是一种平衡多路查找树,它的每一个节点最多包含K个孩子,K被称作为B树的阶,K的大小取决于磁盘页的大小。
定义
一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
- 根结点至少有两个子女;
- 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
- 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
- 所有的叶子结点都位于同一层。
- 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
示例图
卫星数据示例:
什么是B+树?
B+树是B树基础上为了更充分的利用结点空间,让遍历查询速度更稳定而扩展的结构,它规定只在叶子节点存数据,非叶子结点只存索引,且叶子结点用一个链表连接起来。
定义
一个m阶的B+树具有如下几个特征:
- 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
- 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
示例图
卫星数据示例:
区别
- B树的所有节点除了包含数据索引外,还都包含实际的卫星数据,而B+树的非叶子节点只进行数据索引,不包含卫星数据,所有的实际数据都在叶子节点保存。
- 由于卫星数据存储结构不同,B树的查找效率最快为根节点,最慢为叶子节点,而B+树的每次查找都是在叶子节点,相对稳定。
- 由于B+树的非叶子节点只存贮数据索引,不包含卫星数据,那相同大小的磁盘页相较于B树,能更多的存放数叶子节点,从而降低树结构的整体高度,减少查询时的磁盘IO操作。
- B+树的范围查询效率更快,B树需要从根节点依次向下遍历,查找到最小值,然后反向倒推遍历整个树结构,需要做局部的中序遍历,可能要跨层访问,直到找到最大值为止,而B+树只需要找到最小值,然后沿着叶子链表索引逐个比较找到最大值即可。