面试题答案
一键面试数据插入导致B+树索引节点分裂时数据页的分裂操作
- 判断节点是否已满:当新数据插入时,首先检查目标数据页(索引节点)是否还有足够空间。如果数据页已满,无法容纳新记录,则触发分裂操作。
- 选择分裂位置:确定需要分裂后,会在数据页内选择一个分裂点。一般来说,会按照一定规则(例如平分记录)将数据页中的记录分成两部分。
- 创建新数据页:分配一个新的数据页,将原数据页中后半部分(或根据具体规则划分的部分)的记录移动到新数据页中。
- 更新父节点:在父节点中,为新的数据页创建一个新的索引项,该索引项的键值为新数据页中最小的键值(对于B+树叶子节点索引)。同时,更新父节点中指向原数据页的索引项,使其范围涵盖原数据页剩余的记录。如果父节点也因此变得满了,可能会递归地导致父节点的分裂。
对查询性能的影响
- 短期影响:在分裂操作瞬间,数据库需要执行一系列的I/O操作,包括读取原数据页、写入新数据页以及更新父节点等。这会增加磁盘I/O开销,导致查询响应时间短暂上升。特别是对于高并发查询场景,这种短暂的性能下降可能会更加明显,因为可能会产生I/O竞争。
- 长期影响:分裂操作可能会导致数据分布的变化,原本连续存储的数据页可能变得不连续。这会影响磁盘预读的效率,因为预读机制通常是基于顺序访问假设的。在后续查询中,如果需要遍历相关数据,可能需要更多的随机I/O操作,从而降低查询性能。另外,分裂导致的索引结构变化可能会影响查询优化器对执行计划的选择,可能选择不太高效的执行计划。
删除数据导致B+树索引节点合并时数据页的合并机制
- 判断节点是否需要合并:当删除数据后,会检查被删除记录所在的数据页是否低于最小填充因子(一般为50%,可配置)。如果低于这个阈值,并且其相邻兄弟节点有足够空间容纳当前节点剩余记录,则考虑进行合并操作。
- 选择合并兄弟节点:在满足合并条件的情况下,选择合适的兄弟节点(通常是左兄弟或右兄弟)进行合并。一般会优先选择能使合并后数据页利用率更高的兄弟节点。
- 合并数据页:将当前数据页中的剩余记录移动到选定的兄弟节点中,并释放当前数据页。
- 更新父节点:父节点中相应的索引项需要更新,以反映合并后的数据页范围变化。如果父节点因为此次更新导致其索引项数量过少(低于最小填充因子),可能会递归地触发父节点与兄弟节点的合并。