MySQL 核心筆記:InnoDB 存儲引擎架構深度解析(卷一)
本文整理自《MySQL 內核 InnoDB 存儲引擎》卷一的核心知識點,涵蓋從基礎數據結構到事務處理的完整體系,適合希望深入理解 MySQL 底層機制的開發者與 DBA 參考。
目錄概覽
- 概覽
- 基本數據結構與算法
- 同步機制
- 重做日志
- Mini-Transaction (MTR)
- 存儲管理
- 記錄格式
- 索引頁結構
- 鎖機制
- B+ 樹索引
- Insert Buffer
- 緩沖池
- 事務處理
- 數據字典
- 服務管理
核心模塊詳細解析
同步機制
InnoDB 採用 RW-Lock(讀寫鎖)與 Latch(閂鎖)協同工作。X-Latch 支持遞歸,S-Latch 不支持。獲取鎖先嘗試自旋,超時後進入等待隊列。若 sync_primary_wait_array 中 1000 個 cell 全滿,將觸發 ut_error 導致崩潰。釋放 Latch 時調用 sync_array_signal_object 喚醒等待線程。
重做日志
- 作用:保證事務持久性;Undo Log 用於回滾與 MVCC。
innodb_flush_log_at_trx_commit 參數控制刷盤策略(0/1/2)。
- 物理邏輯日志:記錄頁內修改;Binlog 記錄邏輯操作。
- LSN:日志序列號,單調遞增,標識寫入量與檢查點位置。
- 檢查點:Sharp/模糊檢查點,將緩沖池髒頁刷盤。
- 日志文件固定大小(循環寫入),塊大小 512B 與磁盤扇區對齊,保證寫入原子性。
- 組提交:減少 fsync 次數,通過
log_flush_up_to 優化。
- 崩潰恢復流程:
recovery_from_checkpoint_start → 解析日志 → 哈希表應用 → 頁恢復。
Mini-Transaction (MTR)
- FIX 規則:修改頁前必須持有頁 Latch。
- 每頁維護 LSN,防溢出機制。
- Force-Log-at-Commit:提交時若頁被修改,先修改緩沖池頁,再釋放
log_sys->mutex(熱點鎖)。
- 提供快速/慢速兩條日志寫入路徑;多行更新使用
MLOG_MULTI_REC_END 標記。
存儲管理
- 頁大小 16KB;Extent = 64 個連續頁。
- 表空間結構:
fil_system / space / node_struct。
- 段管理:每表至少兩段(聚集索引葉子/非葉子節點),段最多管理 32 個零散頁 + 多個 Extent。
- 4 個異步 I/O 線程:讀、寫、Insert Buffer、Redo Log。
記錄與索引頁
- 物理記錄:Heap No 從 2 開始;Infimum/Supremum 偽記錄充當邊界。
- VARCHAR NULL 不佔磁盤空間;CHAR NULL 用 0x00 填充。
- 大記錄 存儲於溢出頁;邏輯記錄用
dtuple_struct / big_rec_struct。
- B+ 樹僅定位頁,頁內記錄二分查找;Page Directory 通過 Slot 實現 O(log n) 定位。
- MVCC 通過隱藏事務 ID 列 +
read_view_struct 實現版本可見性判斷。
鎖系統
- 行級鎖:S 鎖(共享)、X 鎖(排他);意向鎖(IS/IX)為表級,揭示行鎖意圖。
- 兼容性矩陣:X 與一切衝突;S/S 兼容;IX/IS 互兼容;X/IX、X/IS、S/IX 衝突;S/IS 兼容。
lock_rec_struct 結構:{space, page_no, n_bits};所有鎖受 kernel_mutex 保護(熱點)。
- Gap Lock、Next-Key Lock 解決幻讀;顯式/隱式鎖優化;死鎖檢測與回滾策略。
B+ 樹索引操作
- 分裂:
btr_page_split_and_insert;合並:btr_compress;查找:btr_cur_search_to_nth_level。
- 唯一約束查找用
PAGE_CUR_GE 模式。
- DML 優化:樂觀插入/更新 → 悲觀回退;主鍵更新本質為刪除+插入。
- 持久游標
btr_pcur_struct;自適應哈希索引加速熱點頁訪問。
Insert Buffer
- 合併非唯一輔助索引插入,大幅提升寫入性能。
- 核心難點:死鎖處理;頁邏輯分層:非 IB 頁、IB 非 Bitmap 頁、Bitmap 頁。
- 異步 I/O 線程可能引發死鎖,通過
rw_lock_x_lock_move_ownership 緩解。
緩沖池
- 三大鏈表:LRU、Free、Flush。
- 預讀策略:隨機預讀(32 頁中 9 頁活躍)、線性預讀、邏輯預讀。
- 頁刷新:Doublewrite Buffer(2MB,128 頁/次)解決部分寫問題。
事務處理
- 分類:扁平、帶保存點、鏈式、嵌套、分布式。
- Undo 存儲:Rollback Segment + Undo Segment;
trx_undo_struct 管理。
- 一致性非鎖定讀:Read View 機制;
read_view_sees_trx_id 判斷可見性。
- Purge 線程清理舊版本;Rollback 按類型處理;
roll_ptr 7 字節指向 Undo 記錄。
本筆記僅覆蓋卷一核心內容,卷二將深入並行控制、性能調優等進階主題。建議配合源碼閱讀,加深對 InnoDB 內核的理解。