MySQL(十一)】Innodb 頁結構

Innodb以頁爲單位存儲數據,是操作磁盤的基本單位。一頁是16kb大小。有多種類型的頁,這裏看下存儲數據和索引的頁,叫做index page。一個index page主要包含以下7部分信息:

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

數據部分都存在user records區。瞭解各個索引頁結構的作用還需要結合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是怎樣運行的》一書)

接着看下page header部分,這是索引頁這種類型的頁所特有的結構。裏面會包含當前索引頁的各種統計信息以及鏈表頭指針等信息。

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

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

可以看到,各個數據頁也是通過指針連接的,最終形成了一個雙向鏈表。看上去可能長這樣:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章