InnoDB 表空間採用邏輯分層:**Space (表空間) → Segment (段) → Extent (區) → Page (頁)**。最小分配單位為 Page (默認 16KB),Extent 固定 64 Pages (1MB),Segment 由多個 Extent + 32 個碎片頁組成。底層通過**磁盤雙向鏈表** 管理邏輯關係。
fil0lst.*)// 地址定位結構
typedef struct fil_addr_t {
ulint page; // Space 內頁號
ulint boffset; // 頁內字節偏移 (2 字節)
} fil_addr_t;
// 鏈表節點 (12 字節)
struct flst_node_t {
fil_addr_t prev; // 前驅
fil_addr_t next; // 後繼
};
// 鏈表基節點 (頭信息)
struct flst_base_node_t {
uint32 len; // 節點數
fil_addr_t first; // 首節點
fil_addr_t last; // 尾節點
};
通過 fil_addr_t + Buffer Pool 映射 可 O(1) 定位內存節點。
struct xdes_t {
fil_addr_t fseg_id; // 所屬 Segment ID
flst_node_t list; // 磁盤鏈表節點 (Free/Free_Frag/Full_Frag/FSEG)
uint32 state; // XDES_FREE / XDES_FREE_FRAG / XDES_FULL_FRAG / XDES_FSEG
uint32 bitmap[16]; // 64 pages × 2 bits (used, clean)
};
| 字段 | 含義 |
|---|---|
| space_id | 表空間 ID |
| size | 最大頁數 (擴容時更新) |
| limit | 已初始化頁數 |
| free | 完全空閒 Extent 鏈表 |
| free_frag | 有碎片頁空閒 Extent 鏈表 |
| full_frag | 無空閒頁 Extent 鏈表 |
| seg_id | 下一可用 Segment ID |
| full_inode_list / free_inode_list | Inode 頁鏈表 |
struct fseg_inode_t {
uint32 fseg_id; // Segment ID
uint32 n_used; // Not_full 鏈表已用頁數
flst_node_t free; // 空閒 Extent 鏈表
flst_node_t not_full; // 部分使用 Extent 鏈表
flst_node_t full; // 滿 Extent 鏈表
uint32 magic_n; // 校驗魔數
uint32 frag_arr[32]; // 碎片頁頁號陣列 (新建表先分配 32 頁碎片)
};
Space (Tablespace) ├── Page 0: FSP_HDR + XDES[0..255] (Extent 0..255) ├── Page 16384: XDES[256..511] ├── ... ├── Inode Pages (管理 Segment) │ ├── Inode 0 → Segment 0 (B+Tree 索引/數據) │ ├── Inode 1 → Segment 1 (Undo Log) │ └── ... └── Data Pages (葉子頁/非葉子頁/Undo 頁/臨時頁 ...)
fsp0fsp.*)fsp_alloc_seg_inode)FSP_SEG_INODES_FREE 鏈表獲取有空槽的 Inode 頁。FSP_FREE 分配新 Inode 頁 (fsp_alloc_seg_inode_page)。FSP_SEG_INODES_FULL。fseg_alloc_free_page_low)Inode 管理,按優先級:
直接操作 Space 級 FSP_FREE_FRAG / FSP_FULL_FRAG 鏈表,不經 Inode,適合小對象 (如臨時表)。
Extent 內通過 Bitmap 掃描首個 used=0 頁,設置 used=1,更新 n_used,若 Extent 滿則移動鏈表節點 (Free→Not_full→Full)。
| 文件 | 職責 |
|---|---|
fsp0fsp.c/h | 表空間核心管理 (分配/釋放/擴容/校驗) |
fil0fil.c/h | 文件 I/O 抽象層 (打開/關閉/讀寫/同步) |
page0page.c/h | 頁操作 (解析/壓縮/校驗/目錄槽) |
fseg0fseg.c/h | Segment 操作 (創建/擴展/釋放/碎片管理) |
buf0buf.c/h | Buffer Pool 頁緩存管理 |
ALTER TABLE ... AUTO_INCREMENT=N 可減少擴容頻率。OPTIMIZE TABLE 觸發重建,釋放碎片 Extent 回 Free 列表。innodb_file_per_table=1 使每表獨立 .ibd,便於遷移/截斷/備份。Innodb_tablespace_free, Innodb_tablespace_used, Innodb_fseg_* (需啟用監控插件)。