前言
很多人都見過下面這張圖,或者類似的這張圖。如果沒有對InnoDB的二進位制儲存檔案有所瞭解,那麼對下圖的瞭解不會很清晰。如果已經有所瞭解,再來看這張圖那麼就會略懂。
分析
(1)表空間的第一個extent0
的前3個Page
很特殊,分別是:FSP_HDR
,IBUF_BITMAP
和INODE
。上圖則是從FSP_HDR
和INODE
兩個Page
出發。
(2)FSP_HDR
的3個連結串列:FSP_FREE
,FSP_FREE_FRAG
,FSP_FULL_FRAG
直屬於表空間。每個連結串列都是指向的XDES Entry
的頭尾指標。XDES Entry
透過List Node
前後指標形成了雙向連結串列。
FSP_FREE
:表示的是空閒的Extent
,如果需要申請空間都必須從這裡申請。FSP_FREE_FRAG
:還存在空閒頁的碎片區
。表空間中用到的碎片區
透過這個連結串列管理。往往這些碎片區
中的Page
屬於多個Segment
。FSP_FULL_FRAG
:已用完的碎片區
。若FSP_FREE_FRAG
的碎片區
用完了則移到這個連結串列。反之如果FSP_FULL_FRAG
有了空閒頁面則移到FSP_FREE_FRAG
。
(3)INode Page
的3個連結串列:FSEG_FREE
、FSEG_NOT_FULL
、FSEG_FULL
。
FSEG_FREE
:Fragment
用完之後,分配給該段但是還沒有用的Extent
。FSEG_NOT_FULL
:FSEG_FREE
中的Page
被用了之後,則連結在此。FSEG_FULL
:若FSEG_NOT_FULL
的Page
都被用完,則連結在此。反之如果FSEG_FULL
的某個Page
被釋放,則連結到FSEG_NOT_FULL
。如果所有Page
被釋放也不會到FSEG_FREE
,而是交回FSP_FREE
。
(4)SEG_INODES_FULL
:已被完全用滿的Inode page
連結串列。什麼情況完全用滿了呢?所有的INode Entry
都被用了。不過一個索引也就佔用2個INode Entry
,想要佔用完那得42
個索引。應該沒有這個可能吧?SEG_INODES_FREE
:但凡還有一個INode Entry
是空閒的,則連結在此。透過這個連結串列則可以快速找到表空間
中所有的INode Entry
。透過INode Entry
則可以找到Fragment
和XDES Entry
,進而所有的Page
也都可以找到。
本作品採用《CC 協議》,轉載必須註明作者和本文連結