MySQL InnoDB 存儲引擎深度解析:表結構與頁管理(二)
承接上篇,繼續深入 InnoDB 表的內部結構,重點剖析資料頁架構、命名檔案格式、視圖與分區表。
4. InnoDB 資料頁結構
頁是 InnoDB 管理磁碟的最小單位(預設 16KB)。B-tree 節點頁存放實際行資料。頁由七大部分組成:
- File Header(檔案頭,38 bytes):頁類型、校驗和、上下頁指針、LSN 等。
- Page Header(頁頭,56 bytes):頁狀態、堆頂指針、記錄數、垃圾空間等。
- Infimum & Supremum Records:兩個虛擬記錄,分別代表最小/最大邊界,頁建立時生成,永不刪除。
- User Records(用戶記錄):實際行資料,按主鍵順序鏈表存放。
- Free Space(空閒空間):刪除記錄後釋放的空間,形成鏈表供複用。
- Page Directory(頁目錄):稀疏目錄,槽指向記錄相對位置,支援二分查找加速定位。
- File Trailer(檔案尾,8 bytes):校驗和與 LSN,配合 Header 驗證頁完整性。

A. File Header 詳解(8 字段,38 bytes)

關鍵字段:FIL_PAGE_TYPE 標識頁類型(如索引頁、Undo 頁、系統頁等)。
B. Page Header 詳解(14 字段,56 bytes)

記錄頁方向、記錄數、垃圾空間大小、最後插入位置等。
C. Infimum 與 Supremum
Compact 與 Redundant 格式下佔用空間不同:

D. User Record 與 Free Space
刪除記錄不立即物理移除,而是加入空閒鏈表,後續插入可複用。
E. Page Directory(頁目錄)
- 槽為稀疏目錄,每槽可含多條記錄(n_owned 4~8)。
- 記錄按索引鍵值有序,支援二分查找定位槽,再順序遍歷精確定位。
- B+樹只能定位到頁,頁載入記憶體後靠 Page Directory 二分查找,耗時極低通常忽略。
F. File Trailer
8 bytes:前 4 bytes 為頁校驗和,後 4 bytes 為 LSN。與 Header 對比驗證頁是否完整寫入磁碟。參數 innodb_checksums 控制啟用,5.6.6+ 新增 innodb_checksum_algorithm(crc32/innodb/none/strict_*)。
5. Named File Formats 機制
為解決版本間頁格式不兼容(如 1.0.x 引入壓縮、Off-page 存儲),引入 innodb_file_format(Antelope/Barracuda)與 innodb_file_format_check(預設 ON)參數管理兼容性。
6. 視圖
虛擬表,由 SQL 定義,無物理存儲。實際開發中較少使用,略過。
7. 分區表
僅支援水平分區(Range/List/Hash/Key),垂直分區不支援。實際專案中較少用到,略過。