叶子节点如何在innodb的物理空间中分裂?

时间:2018-01-21 07:19:37

标签: data-structures innodb

如果按升序插入按键,则根据正常的B +树特征,当叶子页面已满时,它将分割,并且会有一个新页面被引入B +树。

例如,如果存在最多包含3个键的叶页。

(page0)|1|2|3|

然后插入密钥4:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

在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 插入的记录与当前插入的记录进行比较,如果插入位于相同的"方向",则计数器递增。然后检查该计数器以确定页面拆分行为;是分成两半还是创建一个新的空页面。

在实践中,这种优化并不完美,并且插入主要按顺序,完全按顺序存在很大差异。如果插入只是主要按顺序,则可能意味着页面方向可能永远不会得到适当的设置,并且页面将最终填满一半(如您所述)。