一、B树即B-树
定义:一个m阶(它的每个节点最多包含m个孩子,m就是B树的阶)的B树具有以下特征:
1. 根节点至少含有两个子女。
2. 每个中间节点都包含k-1个元素和k个孩子,其中m/2 <= k <=m。
3. 每个叶子节点都包含k-1个元素,其中m/2 <= k <= m。
4. 所有的叶子节点都位于同一层,叶子节点不包含任何关键信息。
5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分。
二、B+树
定义:一个m阶的B+树具有以下特征:
1. 有k个子树的中间节点包含有k个元素(B树是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点中。
2. 所有的叶子节点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接。(链表)
3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
4. B+树查找时是自上向下查找,B-树是从下向上查找(中序遍历)。
需要注意的是:根节点的最大元素就是整个B+树的最大元素,以后无论插入删除多少元素,始终要保持最大元素在根节点中。每个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。
三、B-树和B+树的区别
1、卫星数据的位置不同:
(所谓的卫星数据,指的是索引元素所指向的数据记录,比如数据库中的某一行。)
B-树:无论是中间节点还是叶子节点都带有卫星数据,即无论在哪里找到都直接返回。
B+树:只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。
(补充:在数据库的聚集索引中,叶子节点直接包含卫星数据。在非聚集索引中,叶子节点带有指向卫星数据的指针,需要再做一次回表查找)
这样设计的好处:
①:单元素查询的时候,B+树自顶向下查找节点,最终找到匹配的叶子节点:
例如:查找元素3,需要三次磁盘IO操作。
B+树的优势在:
1)B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。在相同的数据量下,B+树的结构比B-树更加“矮胖”,因此查询时IO次数更少。
2)B+树的查询最终都会到达叶子节点,而B-树只要找到匹配元素即可,无论是在中间节点还是叶子节点,因此B-树的查找性能不稳定(最好是根节点,最坏是叶子节点),而B+树每次查找都是稳定的。
②:范围查询的时候,例如查询3-11的范围
B-树需要单行查询到3,再中序遍历到11,比较繁琐。
B+树只要自顶向下找到3,然后通过链表指针,向右遍历到11即可。
总结B+树的优势:
1.单一节点存储更多的元素(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。