MySql索引(B +树)中的指针如何有效,而索引可能存储在磁盘中并返回另一页?

时间:2019-04-25 02:56:11

标签: mysql innodb

我知道MySql Innode引擎中的B +树索引存储在页面中(页面由MySql管理)。一个节点在一页上。而且我知道MySql会在可用页面不足时将一些节点放到磁盘上,然后有时从磁盘读回节点,然后将它们再次放到一些可用页面上。所以这是我的问题:

1,如果子节点现在位于第1页上,则一个节点具有指向其子节点之一的指针。例如,指向子节点的指针是0x7c11111111111111(因为子节点的地址是0x7c11111111111111)。

2,则可用页面不足,因此MySql将子节点放在磁盘上,有时有时又将子节点从磁盘读回到一页,例如第二页(因为第二页现在是空闲的)。

3,在我看来,子节点的地址已更改(再次不是0x7c11111111111111,因为该节点位于页面2上,而不是页面1上)。那么,当指针仍然为0x7c11111111111111时,父节点仍如何找到子节点?

1 个答案:

答案 0 :(得分:1)

InnoDB B + Tree中的每个节点(数据或索引)都由“块号”永久编号,这实际上是其在文件中的位置(.ibdibdata1)。将节点提取到buffer_pool时,会将其放置在有位置的位置。查找机制将块号映射到buffer_pool中的RAM地址。

如果该块被修改,它将最终被写回到文件中同一位置的磁盘上。

如果该块被分割(例如,由于INSERTing行过多),则从空闲列表中拉出另一个块进行分割。由于“ B + Tree”中的+,这意味着需要更新几个链接,以将该新块滑入B + Tree块的顺序链中。所有这些都是在块位于buffer_pool中时完成的。这两个节点的父节点需要更新,并且可能也需要拆分。

由于任何原因修改的块都标记为“脏”。后台任务负责最终将脏块写入磁盘。

这些块从不(连续地除外)连续编号为1,2,3,等等。“下一个”块可以具有任何“数字”。此外,数字不一定是单调的,因为满足“拆分”的“自由”块的数字可能较小。

由于“表空间”,buffer_pool_instances,ibdata1的扩展,撤消,重做,历史链等,上述所有操作都更加复杂。