簡體   English   中英

MySql索引(B +樹)中的指針如何有效,而索引可能存儲在磁盤中並返回另一頁?

[英]how the pointer In MySql Index(B+ tree) keep valid while the Index may store in disk and come back in another page?

我知道MySql Innode引擎中的B +樹索引存儲在頁面中(頁面由MySql管理)。 一個節點在一頁上。 而且我知道MySql會在可用頁面不足時將一些節點放到磁盤上,然后有時從磁盤讀回節點,然后將它們再次放到一些可用頁面上。 所以這是我的問題:

如圖1所示,如果子節點現在位於頁面1上,則一個節點具有指向其子節點之一的指針。 例如,指向子節點的指針是0x7c11111111111111(因為子節點的地址是0x7c11111111111111)。

2,然后可用頁面不夠用,所以MySql將子節點放在磁盤上,有時又將子節點從磁盤讀回到一頁,例如第2頁(因為第2頁現在是空閑的)。

3,我認為,子節點的地址已更改(再次不是0x7c11111111111111,因為該節點位於第2頁,而不是第1頁)。 那么,當指針仍然為0x7c11111111111111時,父節點仍如何找到子節點?

InnoDB B + Tree中的每個節點(數據或索引)都由“塊號”永久編號,這實際上是其在文件中的位置( .ibdibdata1 )。 將節點提取到buffer_pool時,會將其放置在有位置的位置。 查找機制將塊號映射到buffer_pool中的RAM地址。

如果該塊被修改,它將最終被寫回到文件中同一位置的磁盤上。

如果該塊被分割(由於,例如, INSERTing過多的行到它),然后另一個塊從分割空閑列表拉。 由於的+在“B +樹”,這意味着一對夫婦的鏈接需要更新到這個新的塊滑入B +樹塊的順序鏈。 所有這些都是在塊位於buffer_pool中時完成的。 這兩個節點的父節點需要更新,並且可能還會拆分。

因任何原因修改的塊都標記為“臟”。 后台任務負責最終將臟塊寫入磁盤。

這些塊從不(連續地除外)連續編號為1,2,3,等等。“下一個”塊可以具有任何“數字”。 此外,數字不一定是單調的,因為滿足“分割”的“自由”塊可能具有較小的數字。

由於“表空間”,buffer_pool_instances,ibdata1的擴展,撤消,重做,歷史鏈等,上述所有操作都更加復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM