整體架構分層
+---------------------+
| 連接池 / 線程管理 |
+---------------------+
| 管理服務與工具 |
+---------------------+
| SQL 接口 |
+---------------------+
| 查詢分析器 |
+---------------------+
| 優化器 |
+---------------------+
| 緩存 (Query Cache) |
+---------------------+
| 插件式存儲引擎 API |
+----------+------------+
|
+-------+-------+-------+-------+
| InnoDB | MyISAM | NDB | Memory | ...
+-----------------------------+
|
物理文件 (數據、日志、配置、Socket、PID)
主流存儲引擎特性對比
| 引擎 | 定位 | 鎖粒度 | 事務 | 特色 |
| InnoDB | OLTP | 行鎖 | ✅ ACID | MVCC、插入緩衝、二次寫、自適應哈希、預讀 |
| MyISAM | OLAP/只讀 | 表鎖 | ❌ | 全文索引、壓縮表、.MYD/.MYI 分離 |
| NDB Cluster | 高可用集群 | 行鎖 | ✅ | Share-nothing、內存為主、自動分片 |
| Memory | 臨時/緩存 | 表鎖 | ❌ | Hash 索引、重啟數據丟失 |
| Archive | 歸檔/日志 | 行鎖 | ❌ | zlib 壓縮 1:10、僅 INSERT/SELECT |
| Maria (Aria) | MyISAM 替代 | 行鎖 | ❌ | 緩存數據+索引、MVCC、崩潰安全 |
InnoDB 核心架構
後台線程(默認 7 個,新版擴展)
- Master Thread(最高優先級):刷日志、合併插入緩衝、刷髒頁、清理 Undo、生成檢查點
- 4× IO Thread:Read、Write、Insert Buffer、Log
- Lock Monitor、Error Monitor
內存結構
- Buffer Pool:核心緩存(數據頁、索引頁、Undo、插入緩衝、自適應哈希、鎖信息、數據字典),默認 128MB,建議 60-80% 物理內存。
- Redo Log Buffer:重做日志先寫緩存,再按策略刷盤。
- Additional Memory Pool:內部數據結構(5.6.3+ 合併入 Buffer Pool)。
關鍵特性機制
| 特性 | 核心原理 | 解決問題 |
| Insert Buffer | 非唯一輔助索引頁不在內存時,先寫 Insert Buffer 內存/磁盤,Master Thread 定期合併 | 避免離散讀寫輔助索引,大幅提升寫入性能 |
| Doublewrite | 刷盤前先寫共享表空間副本,再寫數據文件;崩潰恢復時用副本修復頁再 Redo | 防止部分寫導致頁損壞,保證頁級原子性 |
| Adaptive Hash Index | 監控索引查找模式,熱點 B+Tree 頁自動建 Hash 索引 | 等值查詢 O(1) 級加速 |
| Change Buffer (5.5+) | Insert Buffer 升級,支援 Delete/Update 緩衝 | 擴展寫優化範圍 |
文件體系
| 類別 | 文件 | 說明 |
| 參數文件 | my.cnf / my.ini | 啟動配置、內存結構大小、路徑 |
| 日志文件 | error.log、binlog、slow.log、general.log | 錯誤、二進制(復制/恢復)、慢查詢、通用查詢 |
| Socket/PID | mysql.sock、mysqld.pid | 本地連接、進程 ID |
| 表結構 | *.frm | 每表一個,存列定義、索引定義 |
| InnoDB 表空間 | ibdata1 (系統表空間)、*.ibd (獨立表空間) | 數據、索引、插入緩衝、Undo、系統頁 |
| Redo Log | ib_logfile0/1 | 循環寫入,崩潰恢復核心 |
索引與算法
- B+Tree:高扇出(通常 2-3 層),葉子節點存數據。聚簇索引按主鍵組織,輔助索引葉子存主鍵值(bookmark)。
- 最左前綴原則:聯合索引
(a,b,c) 支援 a、a,b、a,b,c,不支援 b、c、b,c。
- Hash 索引:自適應、僅等值查詢、Memory 引擎默認。
- 二分查找:Page Directory 槽稀疏目錄,頁內定位行用二分。
鎖機制