常见问题:MySQL/B+树

平衡二叉树

此前讲红黑树时也提到了平衡二叉树,红黑树和AVL树都是能保证树不退化的平衡二叉树,平衡二叉树采用二分思想组织数据,能大大提高单点查找数据的效率,其组装过程略。

作为对比,此处也列出平衡二叉树规则

  1. 节点最多有两个子节点。
  2. 节点大于其左子节点小于其右子节点。
  3. 树的左右两边层级最多相差不大于1。

但平衡二叉树的性能和层级成反比,如果层级过多,则影响效率。因此数据库使用平衡二叉树组织数据过于低效,产生了B树。

B树

结构

B树即多路平衡查找树,也叫多叉树,其规则如下:

  1. 递增排序,左小右大。
  2. 一个节点的子节点数在(1,m]且m>=2。
  3. 一个节点的关键字数量为[(m-1)/2,m)。
  4. 所有叶子节点在同层。

查询

由于B树采用左小右大的原则,可以快速定位数据所在的区间,能够快速定位到单点。

插入

  1. 根据区间正常插入到叶子节点。
  2. 所在节点元素数超过m-1时,拆分,中间元素提到父节点,左边元素构成一个叶子节点,右边元素构成一个叶子节点。若引起父节点溢出,则递归拆分。

删除

  1. 根据区间正常定位到关键字,删除。
  2. 所在节点元素数小于(m-1)/2,从子节点取点补缺,若子节点没有可取点,则从父节点取点补缺,若引起父节点元素数不足,递归此问题。

除了有效减少数据的层数时,B树可以把块大小设置为4k,这样和磁盘块大小相同,可以快速将一个节点的数据全部取出,提高了性能。

B+树

相对于B树,B+树将所有元素都存储到叶子节点,非叶子节点保存的是叶子节点首条数据的引用,用于检索,因此B+树的叶子节点数=关键字数。此外,B+树的每个叶子节点,都包含着指向相邻叶子节点的指针。

B+树的插入和B树几乎一致,只是拆分时不会将元素提到叶子节点,而是将元素的引用提到叶子节点(左节点包含m/2个元素),并递归拆分。

删除时,若删除后节点元素不足,优先从兄弟节点借一个元素,并更新父节点的引用。若兄弟节点不能借出节点,则将两节点合并为同一节点,并更新父节点引用。引起父节点元素不足时,递归操作,当根节点只有一个子节点时则进行降级,引用下移并删除节点。

B+树有以下好处:

  1. B+树非叶子节点仅存储引用,相对很小,一次性读入内存的关键字多(类似KV分离的好处)。
  2. B+树所有元素都在叶子节点,查询效率稳定。
  3. 叶子节点指向相邻兄弟节点,可以快速scan。

B*树

B树在B+树基础上,将非叶子节点也加上指向兄弟节点的指针,并定义非叶子节点关键字个数至少为(2/3)m,进而获取了更高的空间利用率。

posted @ 2019-09-10 21:02  CieloSun  阅读(868)  评论(0编辑  收藏  举报