【问题标题】:How does the leaf node split in the physical space in innodb?叶节点在innodb的物理空间中是如何分裂的?
【发布时间】:2018-01-22 06:11:04
【问题描述】:

如果key是按升序插入的,按照正常的B+-tree特性,当叶子页满了的时候,会分裂,会有一个新的页面引入B+-tree。

例如,如果一个叶子页面最多包含 3 个键。

(page0)|1|2|3|

然后插入钥匙4:

              |1|3|*|(page0)
(page1)|1|2|*|       |3|4|*|(page2)

在此之后,后面的键将被插入到 page2 直到下一次拆分,因为它们是按升序排列的。所有之前的页面都将保持半满。

在我的例子中,我想这会导致空间被浪费。但是,在数据库中,这似乎是不合理的。这真的让我很困惑。我读过Jeremy Cole-B+Tree index structures in InnoDB,但我可能误解了一些东西。

【问题讨论】:

    标签: data-structures innodb


    【解决方案1】:

    如果没有额外的优化,您完全正确的是,当索引页面被填充时,它会被分成两半,然后永远保持半填充状态。但是,InnoDB 根据其对插入顺序的感知来优化索引填充。也就是说,如果它检测到插入是按顺序进行的(升序或降序),它不会将页面分成两半,而是创建一个新的空白页面以在页面的“边缘”插入。

    在 MySQL 手册部分The Physical Structure of an InnoDB Index 中有一些关于此的信息。此外,我在Visualizing the impact of ordered vs. random index insertion in InnoDB 的帖子中说明了这种行为的示例。

    The physical structure of InnoDB index pages中我描述了每个索引页面的Last Insert PositionPage DirectionNumber of Inserts in Page Direction字段.这就是升序和降序跟踪的完成方式(尽管是左对右)。每次插入时,last 插入的记录都会与当前插入的记录进行比较,如果插入的“方向”相同,则计数器会递增。然后检查此计数器以确定页面拆分行为;是分成两半还是创建一个新的空白页面。

    在实践中,这种优化并不完美,插入大部分按顺序插入和完全按顺序插入有很大区别。如果插入只是大部分按顺序排列,则可能意味着页面方向可能永远无法正确设置,并且页面最终会填满一半(如您所述)。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2018-05-21
      • 2014-10-12
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多