首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 核心筆記:InnoDB 存儲引擎架構深度解析(卷一)

     編輯:MySQL 綜合教學

MySQL 核心筆記:InnoDB 存儲引擎架構深度解析(卷一)

本文整理自《MySQL 內核 InnoDB 存儲引擎》卷一的核心知識點,涵蓋從基礎數據結構到事務處理的完整體系,適合希望深入理解 MySQL 底層機制的開發者與 DBA 參考。

目錄概覽

  1. 概覽
  2. 基本數據結構與算法
  3. 同步機制
  4. 重做日志
  5. Mini-Transaction (MTR)
  6. 存儲管理
  7. 記錄格式
  8. 索引頁結構
  9. 鎖機制
  10. B+ 樹索引
  11. Insert Buffer
  12. 緩沖池
  13. 事務處理
  14. 數據字典
  15. 服務管理

核心模塊詳細解析

同步機制

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 內核的理解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved