天天看點

【MySQL(十一)】Innodb 頁結構

Innodb以頁為機關存儲資料,是操作磁盤的基本機關。一頁是16kb大小。有多種類型的頁,這裡看下存儲資料和索引的頁,叫做index page。一個index page主要包含以下7部分資訊:

【MySQL(十一)】Innodb 頁結構

(本篇圖檔全部來自掘金小冊中《MySQL是怎樣運作的》一書)

資料部分都存在user records區。了解各個索引頁結構的作用還需要結合innodb的行結構來看。

【MySQL(十一)】Innodb 頁結構

(本篇圖檔全部來自掘金小冊中《MySQL是怎樣運作的》一書)

一行資料的頭資訊包括如上資訊。delete_mask表明該行記錄是否被删除,也就是删除頁裡一條資料僅僅是标記删除而非實體删除。heap_no代表該記錄在頁内的偏移量。record_type表明行記錄的類型,有四種,0和1分别代表了資料行和索引。2和3是innodb自己加的兩條記錄,表示最小和最大值,可以了解為正負無窮。next_record是下一條記錄的偏移量,是以内頁的資料行是靠該字段連接配接的一條單向連結清單。如果記錄被删除,該記錄就會被移對外連結表。

再回到開始的索引頁結構圖中,裡面的Infimum和Supremum區域分别儲存最小和最大記錄。Free Space是頁内空閑位置的指針。被删除的記錄也會形成一個連結清單,這個空間是可回收的。

另外,在user records區裡的資料,是按照索引順序排序存放的,這個排序是指的連結清單是有序的,但是實際實體位置可能是無序的。實體位置與插入先後順序有關。

接着來看下page directory區域。先來想一個問題,根據索引值定位頁内的一條記錄?我們知道資料是一條有序連結清單,連結清單不同于數組,無法直接尋址,是以隻能周遊?如果是這樣那效率肯定不行。page directory就是用來給頁内記錄加目錄的,可以友善的根據索引值來定位記錄。思路大緻是将記錄按照4-8的數目分組,将每一組索引值最大的記錄複制到page directory中,page directory中存放最大值的地方叫做槽。不同的槽也是有序的。行記錄的頭資訊中有一個n_owned的字段就是用來記錄如果目前記錄是分組的最最大值時,該分組内的記錄數目的。這樣定位記錄時需要先找到對應的槽,然後在對應的分組中周遊即可。

【MySQL(十一)】Innodb 頁結構

(本篇圖檔全部來自掘金小冊中《MySQL是怎樣運作的》一書)

接着看下page header部分,這是索引頁這種類型的頁所特有的結構。裡面會包含目前索引頁的各種統計資訊以及連結清單頭指針等資訊。

最後是file header,這是所有類型的頁都有的結構。

【MySQL(十一)】Innodb 頁結構

(本篇圖檔全部來自掘金小冊中《MySQL是怎樣運作的》一書)

可以看到,各個資料頁也是通過指針連接配接的,最終形成了一個雙向連結清單。看上去可能長這樣:

【MySQL(十一)】Innodb 頁結構

(本篇圖檔全部來自掘金小冊中《MySQL是怎樣運作的》一書)

下一篇: 殺手皇後

繼續閱讀