Mysql InnoDb 儲存結構
從上圖可以看出,InnoDb的儲存空間主要分為 段,簇,頁,行。四大結構
-
段是表空間檔案中的主要組織結構,它是一個邏輯概念,用來管理物理檔案,是構成索引、表、回滾段的基本元素。注意,邏輯概念而非物理儲存
-
簇的大小是固定的(1M=64*16k)。簇預設是由64個連續的頁組成的,每個頁大小為16KB。
-
預設是16KB,可以通過引數innodb_page_size修改頁的大小。在邏輯上(頁面號都是從小到大連續的)及物理上都是連續的。在向表中插入資料時,如果一個頁面已經被寫完,系統會從當前簇中分配一個新的空閒頁面處理使用,如果當前簇中的64個頁面都被分配完,系統會從當前頁面所在段中分配一個新的簇,然後再從這個簇中分配一個新的頁面來使用。
-
行我們單獨說明
檔案的組織形式
這個圖很大,剛看會很亂的。我們慢慢地分解下
三種page型別:
-
FIL_PAGE_TYPE_FSP_HDR
-
FIL_PAGE_TYPE_XDES
-
FIL_PAGE_INODE
資料檔案的第一個Page型別為FIL_PAGE_TYPE_FSP_HDR
,在建立一個新的表空間時進行初始化(fsp_header_init
),該page同時用於跟蹤隨後的256個Extent(約256MB檔案大小)的空間管理,所以每隔256MB就要建立一個類似的資料頁,型別為FIL_PAGE_TYPE_XDES
,XDES Page除了檔案頭部外,其他都和FSP_HDR
解釋下上面的話,FIL_PAGE_TYPE_FSP_HDR有兩個作用,一個是跟蹤FIL_PAGE_TYPE_XDES ,一個是跟蹤FIL_PAGE_INODE。
FIL_PAGE_TYPE_XDES用來管理EXTEND的,一個FIL_PAGE_TYPE_XDES管理256個EXTEND。
FIL_PAGE_TYPE_FSP_HDR並不會直接和FIL_PAGE_TYPE_XDES有聯絡,FIL_PAGE_TYPE_FSP_HDR上兩個指標用來跟蹤EXTEND;
Macro | bytes | Desc |
FSP_FREE | 16 | 當一個Extent中所有page都未被使用時,放到該連結串列上,可以用於隨後的分配 |
---|---|---|
FSP_FREE_FRAG | 16 | FREE_FRAG連結串列的Base Node,通常這樣的Extent中的Page可能歸屬於不同的segment,用於segment frag array page的分配(見下文) |
FSP_FULL_FRAG | 16 | Extent中所有的page都被使用掉時,會放到該連結串列上,當有Page從該Extent釋放時,則移回FREE_FRAG連結串列 |
從這幾個欄位的描述,該0號檔案就是用來記錄EXTEND的分配的。它最主要的功能就是管理EXTEND的分配。
關於FIL_PAGE_INODE,FIL_PAGE_TYPE_FSP_HDR是直接和INODE PAGE產生連線的。這裡說下INODE PAGE其實也是用來管理和分配EXTEND的。但是INODE PAGE代表的是一個段,每一個表空間資料和索引都存在一起。一個表空間索引會使用兩個段,索引段和資料段。INODE PAGE會記錄某一個段,(一張表多個索引),屬於這個段的EXTEND會組成一個單鏈表。
由於FIL_PAGE_TYPE_XDES就是跟蹤EXTEND分配的,INODE PAGE跟蹤的EXTEND其實也是由FIL_PAGE_TYPE_XDES分配的。FIL_PAGE_TYPE_FSP_HDR和FIL_PAGE_INODE都會直接指向EXTEND。
Macro | bits | Desc |
---|---|---|
FSEG_INODE_PAGE_NODE | 12 | INODE頁的連結串列節點,記錄前後Inode Page的位置,BaseNode記錄在頭Page的FSP_SEG_INODES_FULL或者FSP_SEG_INODES_FREE欄位。 |
Inode Entry 0 | 192 | Inode記錄 |
Inode Entry 1 | ||
…… | ||
Inode Entry 84 |
Macro | bits | Desc |
---|---|---|
FSEG_ID | 8 | 該Inode歸屬的Segment ID,若值為0表示該slot未被使用 |
FSEG_NOT_FULL_N_USED | 8 | FSEG_NOT_FULL連結串列上被使用的Page數量 |
FSEG_FREE | 16 | 完全沒有被使用並分配給該Segment的Extent連結串列 |
FSEG_NOT_FULL | 16 | 至少有一個page分配給當前Segment的Extent連結串列,全部用完時,轉移到FSEG_FULL上,全部釋放時,則歸還給當前表空間FSP_FREE連結串列 |
FSEG_FULL | 16 | 分配給當前segment且Page完全使用完的Extent連結串列 |
FSEG_MAGIC_N | 4 | Magic Number |
FSEG_FRAG_ARR 0 | 4 | 屬於該Segment的獨立Page。總是先從全域性分配獨立的Page,當填滿32個數組項時,就在每次分配時都分配一個完整的Extent,並在XDES PAGE中將其Segment ID設定為當前值 |
…… | …… | |
FSEG_FRAG_ARR 31 | 4 |