B树很简单,插入So easy

这是数据库索引相关内容的第二篇
复制代码

B树

目录:数据库

  1. 什么是B树
  2. B树的最小度数
  3. B树的高度
  4. 什么状况下使用B树
  5. B树的插入
  6. B树的删除

关于1~4已经在上一节介绍过了B树是个什么玩意post

这里重点介绍B树的插入优化

5. B树的插入spa

B树要保持它的平衡及最小度数(t-1=<n<=2t-1, t<=child<=2t)特性,则须要在插入之后也是一个知足此特性的B树。3d

那么若是是你,如何保证在插入关键字后,新的B树也能知足其特性呢?code

通常的思路是:cdn

  1. 根据B树的排序特性,找到插入的节点
  2. 若是插入的节点是不满的(n<2t-1),直接插入
  3. 若是插入的节点是满的(n=2t-1),则不能直接插入,由于插入之后,就不符合B树的特征了,咱们要一直维护B树的特征, n<=2t-1,因此须要将节点进行拆分;
  4. 节点拆分后,若是只是单纯的拆分,一个child的裂变成两个,显然这么简单的裂变是不行的,由于child+1了,可是父节点的关键字个数n没变,因此不符合child = n+1,子节点多裂变了一个,可是父节点没变;
  5. 因此节点拆分后,须要将中间的数据,提到父节点中;
  6. 可是若是父节点是满的,子节点提到父节点中又不知足B树的特性了,父节点也要裂变,提一个到父父节点中;
  7. 若是父父节点是满的,则又周而复始....

因此这将是个从上到下查找,又从下到上裂变的过程。blog

虽然这也能够实现,可是有没有优化的方法?排序

  1. 观察一下这个过程,自己定位到插入节点时,已经有一次至上到下的过程了;
  2. 若是在至上而下的过程当中,每发现满的节点,就进行拆分呢,是否是就能够作到一次向下查找,就能知足后续的插入裂变。

是的,这就是B树的插入过程!索引

  1. 至上而下查找
  2. 每发现满节点,就进行裂变
  3. 找到插入位置,插入,若是须要裂变,就裂变,由于父节点不多是满的,再刚刚遍历到父节点的时候,已经提早腾出空间了!

就是这么简单!

让咱们来看个例子:

有以下字母:F, S, Q, K, C, L, H, T, V

  1. 假设如今有个空树
  2. 假设t = 2, 即最小度数为2;
  3. 请画出B树的插入过程(只画出关键过程)

解答:

  1. t = 2,意味着咱们节点的关键字个数在1~3之间,一单关键字个数超过3,则要裂变
  2. 在依次插入F,S,Q时,很简单,由于根节点<=3
    在这里插入图片描述
  3. 当插入K时,自上而下的过程当中,发现父节点是满的,必然要先拆分父节点
    在这里插入图片描述
  4. 此时父节点已经被成功拆分红不满的节点,而且子节点个数和排序也符合B树要求
  5. 插入K,好比是从Q向左查找,插入到F以后。
    在这里插入图片描述
  6. 接着要插入C,直接插入的到F以前就行,由于在至顶向下的过程当中,没有发现满节点
    在这里插入图片描述
  7. 好了,下面到L了,当至顶向下的过程当中,L是在Q左侧查找,发现了CFK节点是满的,必然进行拆分; 将中间节点F提上来,父节点个数+1,子节点个数+1, 仍然符合B树特征
    在这里插入图片描述
  8. 拆分以后,插入L
    在这里插入图片描述
    后续的插入,就不用多讲了,重复以上过程。

好了,写的真累,删除下次再写吧


其余相关章节
复制代码

数据库索引相关文章之一:《B树,一点都不神秘》
数据库索引相关文章之二:《B树很简单,插入so easy》
数据库索引相关文章之三:《索引》
数据库索引相关文章之四:《什么索引算是好的索引》
数据库索引相关文章之五:《如何发现及替换不合适的索引》
数据库索引相关文章之六:《索引总结》

相关文章
相关标签/搜索