MySQL 獨特的插件式存儲引擎架構將「SQL 執行層」與「數據存儲層」解耦,允許運行時動態加載/卸載引擎,甚至為不同表指定不同引擎。本文深度解析架構分層、引擎核心職責、主流引擎特性矩陣與選型指南。
┌─────────────────────────────────────┐
│ 連接池/線程管理 │ ← 客戶端協議、認證、連接管理
├─────────────────────────────────────┤
│ SQL 執行層 (Server Layer) │ ← 解析器、優化器、執行器、緩存、鎖管理
├─────────────────────────────────────┤
│ 插件式存儲引擎層 (Storage Engine)│ ← InnoDB、MyISAM、Memory、Archive、NDB...
├─────────────────────────────────────┤
│ 文件系統/裸設備 │ ← 數據文件、日誌文件、配置文件
└─────────────────────────────────────┘
核心接口:handler 類定義了引擎必須實現的虛函數:create()、open()、read()、write()、update()、delete()、index_read()、index_next()、start_stmt()、commit()、rollback() 等。
| 職責維度 | 說明 | 典型差異化實現 |
|---|---|---|
| 並發控制 | 鎖粒度、鎖模式、死檢測 | InnoDB 行鎖+MVCC / MyISAM 表鎖 / NDB 分佈式鎖 |
| 事務支持 | ACID、隔離級別、保存點 | InnoDB 完整支持 / MyISAM 無 / NDB 2PC |
| 引用完整性 | 外鍵約束執行 | InnoDB 支持 / 其他多不支持 |
| 物理存儲 | 頁格式、壓縮、加密、表空間 | InnoDB 16KB 頁+表空間 / MyISAM .MYD/.MYI / Archive zlib 流 |
| 索引實現 | B+樹、Hash、全文、空間、覆蓋 | InnoDB 聚簇+二級 / MyISAM 非聚簇 / Memory Hash |
| 內存緩衝 | Buffer Pool、Key Cache、Query Cache | InnoDB Buffer Pool / MyISAM Key Buffer |
| 性能優化 | 預讀、刷新策略、批量插入、Checkpoint | InnoDB 自適應哈希/鄰接頁預讀 / TokuDB Fractal Tree |
| 特殊功能 | GIS、JSON、全文、插件擴展 | InnoDB 全文/空間 / NDB 分佈式 / RocksDB LSM Tree |
| 引擎 | 事務 | 鎖粒度 | 索引類型 | 壓縮 | 外鍵 | 全文 | 適用場景 |
|---|---|---|---|---|---|---|---|
| InnoDB | ✅ ACID | 行鎖+MVCC | B+樹、全文、空間 | 頁壓縮 | ✅ | 5.6+ | 核心業務、高併發、關鍵數據 |
| MyISAM | ❌ | 表鎖 | B+樹、全文 | ❌ | ❌ | 5.6+ | 只讀/多讀少寫、全文搜索、歸檔 |
| Memory | ❌ | 表鎖 | Hash (默認)、B+樹 | ❌ | ❌ | ❌ | 臨時表、查找表、極速讀取 |
| Archive | ❌ | 行鎖 | 無 | ✅ zlib | ❌ | ❌ | 日志歸檔、寫多讀少 |
| CSV | ❌ | 表鎖 | 無 | ❌ | ❌ | ❌ | 外部工具交換、數據導入導出 |
| NDB Cluster | ✅ 2PC | 行鎖 | B+樹、Hash | ❌ | ✅ | ❌ | 高可用、分佈式、電信級 |
| RocksDB (MyRocks) | ✅ | 行鎖 | LSM Tree | ✅ 多級 | ❌ | ❌ | 寫密集、壓縮敏感、大數據 |
| TokuDB | ✅ | 行鎖 | Fractal Tree | ✅ | ✅ | ❌ | 高壓縮、寫優化、Schema 變更快 |
CREATE TABLE orders_innodb (id BIGINT PRIMARY KEY, ...) ENGINE=InnoDB;
CREATE TABLE logs_archive (id BIGINT PRIMARY KEY, ...) ENGINE=Archive;
CREATE TABLE lookup_memory (code CHAR(10) PRIMARY KEY, ...) ENGINE=Memory;
CREATE TABLE export_csv (...) ENGINE=CSV;
同一 MySQL 進程內,不同表可用不同引擎,SHOW ENGINES 查看支持列表。
繼承 handler 類,實現核心虛函數,編譯為共享庫 ha_myinngine.so,放入 plugin_dir,INSTALL PLUGIN myengine SONAME 'ha_myengine.so' 即可動態加載。典型案例:Spider(分片路由)、CONNECT(異構數據源訪問)、ColumnStore(列式分析)。
插件式存儲引擎是 MySQL 靈活性的基石:Server 層統一 SQL 能力,Engine 層專注存儲特性。理解 8 大職責維度、掌握主流引擎特性矩陣、建立「默認 InnoDB、場景專用」選型思維,是 DBA 與架構師駕馭 MySQL 架構的核心能力。