1. 程式人生 > 實用技巧 >Mysql InnoDb 儲存結構

Mysql InnoDb 儲存結構

該文章是讀了https://blog.csdn.net/bohu83/article/details/81086474的讀書總結,感謝原作者的辛勤付出

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

頁具有相同的資料結構,可以稱之為Extent描述頁,每個Extent佔用40個位元組,一個XDES Page最多描述256個Extent。

解釋下上面的話,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_FREE16當一個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。

MacrobitsDesc
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
MacrobitsDesc
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 總共儲存32個記錄項

每一個Inode entry都可以構成一個單鏈表,該單鏈表上的節點都屬於一個segment。

以上說的page都是在表空間儲存層面,還沒有具體到實際資料的儲存。