0
点赞
收藏
分享

微信扫一扫

MySQL中的索引分裂(Index Split)


MySQL中的索引分裂(Index Split)是指在B+树索引中,当一个节点(页)满了,无法再添加新的记录时,会发生的一种操作。这个过程涉及到将满的节点分裂成两个节点,并且可能会影响到其父节点,甚至更高层的节点。以下是索引分裂的详细解释:

  1. 直接写入:如果叶子节点未满,新记录可以直接写入叶子节点中。
  2. 左旋或右旋:如果叶子节点已满,但相邻的节点未满,可以通过左旋或右旋将数据移动到相邻节点中,从而为新记录腾出空间。
  3. 拆分叶子节点:如果叶子节点满了,且相邻节点也满了,这时需要拆分叶子节点。拆分操作包括以下步骤:
    将叶子节点中的一些记录上移到父节点。
    在叶子节点中写入新记录。
    将拆分后的记录分配到左右两个节点中,小于中间值的放在左边,大于中间值的放在右边。
  4. 拆分父节点:如果父节点也满了,需要对父节点进行拆分,这可能会影响到更高层的节点。拆分父节点的操作包括:
    拆分叶子节点。
    写入叶子节点。
    拆分父节点,将父节点中的一些记录上移到更高层的节点。
    更新父节点中记录的指针,以反映新的页结构。
    如果需要,继续向上拆分,直到找到可以容纳新记录的节点。
  5. 页的错位:页面拆分发生在插入或更新时,并会导致页的错位(dislocation),即页可能会落入不同的区(extent)。
  6. 页合并:一旦产生了分裂的页,MySQL自身(无人为干预)唯一将原先顺序恢复的办法就是新分裂出来的页因为低于合并阈值(merge threshold)被删掉。这时候InnoDB会使用页合并将数据重新合并回来。
  7. 人为干预:可以通过使用 OPTIMIZE 命令来重新整理表,这是一个重量级和耗时的过程,但通常是唯一将大量分散在不同区的页理顺的方法。
  8. 索引锁争用:在页的合并和分裂期间,InnoDB会获取索引树的x-latch,可能会导致索引的锁争用(index latch contention)。
  9. 页分裂的监控:InnoDB使用 INFORMATION_SCHEMA.INNODB_METRICS 表来跟踪页的分裂数,可以查看其中的 index_page_splits 和 index_page_reorg_attempts/successful 统计。


举报

相关推荐

0 条评论