MySQL 將「與文件系統打交道」抽象為存儲引擎層,通過統一 API 與上層 SQL 層解耦,實現「一個服務器,多種引擎,甚至自研引擎」。
+-------------------+
| SQL Layer | 連接池、緩存、解析器、優化器、執行器
+-------------------+
| Pluggable Storage Engines | ← 插件接口:init/read/write/lock/transaction
+-------------------+
| File System / Raw Device |
+-------------------+
| 職責維度 | 引擎實現差異 |
|---|---|
| 並發控制 | 表鎖 vs 行鎖 vs MVCC,鎖粒度決定併發上限 |
| 事務支持 | ACID 完整 vs 無事務 vs 僅保存點 |
| 引用完整性 | 外鍵約束:InnoDB 支持,MyISAM 不支持 |
| 物理存儲 | 頁大小、數據格式、壓縮、文件組織 |
| 索引實現 | B+Tree、Hash、R-Tree、Fulltext,各引擎不同 |
| 內存緩存策略 | Buffer Pool 設計、自適應哈希、插入緩存 |
| 性能優化 | 多 IO 線程、Checkpoint、批量插入、並行讀取 |
| 特殊能力 | GIS 空間、加密、列存、內存表等 |
| 引擎 | 事務 | 鎖粒度 | 外鍵 | 索引類型 | 壓縮 | 備份方式 | 典型場景 |
|---|---|---|---|---|---|---|---|
| InnoDB | ✅ ACID | 行鎖+MVCC | ✅ | B+Tree, Fulltext, Spatial | 頁壓縮 | 熱備份、快照 | 核心業務、高併發 |
| MyISAM | ❌ | 表鎖 | ❌ | B+Tree, Fulltext | 表壓縮 | 冷備份、cp 文件 | 只讀、日志、數倉 |
| MEMORY | ❌ | 表鎖 | ❌ | Hash (默認), B+Tree | ❌ | 不可持久化 | 臨時表、緩存 |
| Archive | ❌ | 行鎖 | ❌ | ❌ | zlib 行壓縮 | 文件複製 | 歸檔日志 |
| CSV | ❌ | 表鎖 | ❌ | ❌ | ❌ | 文本複製 | 外部數據交換 |
| BLACKHOLE | ✅ | 無 | ❌ | ❌ | ❌ | 無 | 複製中繼、測試 |
| MERGE | ❌ | 表鎖 | ❌ | B+Tree | ❌ | 成員表備份 | 邏輯分表聚合 |
| FEDERATED | ❌ | 遠程 | ❌ | 遠程 | ❌ | 遠程 | 跨實例查詢 |
CREATE TABLE t1 (...) ENGINE=InnoDB; CREATE TABLE t2 (...) ENGINE=MyISAM;INSTALL PLUGIN / UNINSTALL PLUGIN(需 .so 文件)handler 接口,編譯為動態庫,註冊至 MySQLInnoDB 為默認首選:5.5+ 默認、事務安全、行級鎖高併發、崩潰恢復、大內存/SSD 友好、生態最完善。
特定場景再評估:只讀分析 → MyISAM/ClickHouse;臨時計算 → MEMORY;歸檔日志 → Archive;跨實例查詢 → FEDERATED。
理解架構原理,才能在海量選擇中做出理性決策,避免「聽說某引擎快」盲目跟風。