这是数据库索引相关内容的第二篇
复制代码
B树
目录:数据库
- 什么是B树
- B树的最小度数
- B树的高度
- 什么状况下使用B树
- B树的插入
- B树的删除
关于1~4已经在上一节介绍过了B树是个什么玩意post
这里重点介绍B树的插入优化
5. B树的插入spa
B树要保持它的平衡及最小度数(t-1=<n<=2t-1, t<=child<=2t)特性,则须要在插入之后也是一个知足此特性的B树。3d
那么若是是你,如何保证在插入关键字后,新的B树也能知足其特性呢?code
通常的思路是:cdn
- 根据B树的排序特性,找到插入的节点
- 若是插入的节点是不满的(n<2t-1),直接插入
- 若是插入的节点是满的(n=2t-1),则不能直接插入,由于插入之后,就不符合B树的特征了,咱们要一直维护B树的特征, n<=2t-1,因此须要将节点进行拆分;
- 节点拆分后,若是只是单纯的拆分,一个child的裂变成两个,显然这么简单的裂变是不行的,由于child+1了,可是父节点的关键字个数n没变,因此不符合child = n+1,子节点多裂变了一个,可是父节点没变;
- 因此节点拆分后,须要将中间的数据,提到父节点中;
- 可是若是父节点是满的,子节点提到父节点中又不知足B树的特性了,父节点也要裂变,提一个到父父节点中;
- 若是父父节点是满的,则又周而复始....
因此这将是个从上到下查找,又从下到上裂变的过程。blog
虽然这也能够实现,可是有没有优化的方法?排序
- 观察一下这个过程,自己定位到插入节点时,已经有一次至上到下的过程了;
- 若是在至上而下的过程当中,每发现满的节点,就进行拆分呢,是否是就能够作到一次向下查找,就能知足后续的插入裂变。
是的,这就是B树的插入过程!索引
- 至上而下查找
- 每发现满节点,就进行裂变
- 找到插入位置,插入,若是须要裂变,就裂变,由于父节点不多是满的,再刚刚遍历到父节点的时候,已经提早腾出空间了!
就是这么简单!
让咱们来看个例子:
有以下字母:F, S, Q, K, C, L, H, T, V
- 假设如今有个空树
- 假设t = 2, 即最小度数为2;
- 请画出B树的插入过程(只画出关键过程)
解答:
- t = 2,意味着咱们节点的关键字个数在1~3之间,一单关键字个数超过3,则要裂变
- 在依次插入F,S,Q时,很简单,由于根节点<=3
- 当插入K时,自上而下的过程当中,发现父节点是满的,必然要先拆分父节点
- 此时父节点已经被成功拆分红不满的节点,而且子节点个数和排序也符合B树要求
- 插入K,好比是从Q向左查找,插入到F以后。
- 接着要插入C,直接插入的到F以前就行,由于在至顶向下的过程当中,没有发现满节点
- 好了,下面到L了,当至顶向下的过程当中,L是在Q左侧查找,发现了CFK节点是满的,必然进行拆分; 将中间节点F提上来,父节点个数+1,子节点个数+1, 仍然符合B树特征
- 拆分以后,插入L
后续的插入,就不用多讲了,重复以上过程。
好了,写的真累,删除下次再写吧
其余相关章节
复制代码
数据库索引相关文章之一:《B树,一点都不神秘》
数据库索引相关文章之二:《B树很简单,插入so easy》
数据库索引相关文章之三:《索引》
数据库索引相关文章之四:《什么索引算是好的索引》
数据库索引相关文章之五:《如何发现及替换不合适的索引》
数据库索引相关文章之六:《索引总结》