面试题答案
一键面试插入数据时B+树维持平衡的过程
- 定位插入位置:从根节点开始,根据比较键值沿着指针向下搜索,直到找到合适的叶子节点位置。
- 插入数据:在叶子节点插入新的数据项。若叶子节点未满(即节点内数据项数量未达到上限),直接插入,此时不影响树的平衡。
- 节点分裂:若叶子节点已满,将该叶子节点分裂为两个新的叶子节点。原节点中约一半的数据项留在原节点,另一半移到新节点。同时,在父节点中插入一个新的索引项,该索引项的键值为新节点的最小键值,指针指向新节点。如果父节点也因此而满,则递归地进行父节点的分裂操作,直至根节点。若根节点分裂,则B+树高度增加1。
删除数据时B+树维持平衡的过程
- 定位删除位置:与插入类似,从根节点开始,根据键值搜索到包含要删除数据项的叶子节点。
- 删除数据:从叶子节点中删除对应的数据项。若删除后该叶子节点的数据项数量仍满足下限要求(一般为节点容量的一半),则直接删除,不影响树的平衡。
- 节点合并:若删除后叶子节点的数据项数量低于下限,尝试向其左右兄弟节点借数据。如果兄弟节点有多余的数据项,则将兄弟节点的一个数据项移动到当前节点,并调整父节点中的索引项。若兄弟节点也没有多余数据,则将当前节点与兄弟节点合并,同时删除父节点中指向合并后节点的索引项。若父节点因此导致数据项数量低于下限,同样递归向上进行合并操作。
插入和删除对索引性能的影响
- 插入影响
- 插入操作频繁时:可能导致大量的节点分裂,这会增加I/O开销,因为每次节点分裂可能涉及到磁盘I/O操作来更新相关节点数据。同时,父节点的更新和可能的递归分裂操作也会增加CPU开销,导致索引性能下降。
- 索引初始创建或数据分布均匀时:插入操作相对较为高效,因为节点分裂情况较少,主要开销在于定位插入位置的查找过程。
- 删除影响
- 删除操作频繁时:可能引发节点合并,同样会带来I/O开销,用于更新磁盘上的节点数据。递归的合并操作也会消耗CPU资源,影响索引性能。特别是当树的高度较高时,递归操作的成本更高。
- 数据删除较为分散时:节点合并的情况相对较少,对索引性能影响相对较小,主要开销仍然是定位删除位置的查找过程。