MySQL 採用插件式存儲引擎架構:Server 層負責連接管理、查詢解析、優化器、緩存;引擎層負責數據存儲、索引維護、事務控制、鎖管理、崩潰恢復。通過 ENGINE= 子句在表級別指定引擎,實現單實例多引擎混用。
-- MySQL 4.1.2+
SHOW ENGINES\G
-- 關鍵列:
-- Engine: 引擎名
-- Support: DEFAULT/YES/NO/DISABLED
-- Comment: 功能描述
-- Transactions: 是否支持事務
-- XA: 是否支持 XA 分布式事務
-- Savepoints: 是否支持保存點
舊版本:SHOW VARIABLES LIKE 'have_%'(have_innodb=YES/DISABLED)。
[mysqld] default-storage-engine=InnoDB 或啟動參數 --default-storage-engine=InnoDBCREATE TABLE t (id INT) ENGINE=InnoDBALTER TABLE t ENGINE=InnoDB(會重建表,大表耗時長、需磁盤空間 2x,建議用 pt-online-schema-change)風險提示:引擎間索引類型、列類型、表大小限制不同,ALTER TABLE ... ENGINE= 可能導致數據截斷/丟失(如全文索引、空間索引、外鍵不支持時)。指定不存在的引擎將靜默回退為 MyISAM(舊版本)或報錯(新版本)。
| 維度 | MyISAM | InnoDB | MEMORY (HEAP) | NDB Cluster |
|---|---|---|---|---|
| 事務支持 | ❌ | ✅ ACID、行鎖、MVCC、外鍵 | ❌ | ✅ 分布式事務 |
| 鎖粒度 | 表鎖 | 行鎖(意向鎖+記錄鎖+間隙鎖) | 表鎖 | 行鎖(分布式協商) |
| 索引類型 | B-Tree、全文(5.6+)、空間 | B+Tree(聚簇索引+二級索引)、全文(5.6+)、空間 | Hash(默認)、B-Tree(可選) | T-Tree、Hash、有序索引 |
| 數據持久化 | 磁盤(.MYD/.MYI) | 磁盤(表空間 .ibd + 共享表空間 ibdata1 + redo/undo log) | 純內存(重啟丟失) | 磁盤+內存(多副本同步) |
| 崩潰恢復 | ❌ 需 REPAIR TABLE | ✅ Redo/Undo Log 自動恢復 | ❌ 數據全丟失 | ✅ 多副本自動故障轉移 |
| 壓縮支持 | ✅ myisampack(只讀) | ✅ 透明頁壓縮、ROW_FORMAT=COMPRESSED | ❌ | ✅ |
| 外鍵約束 | ❌ | ✅ | ❌ | ✅ |
| 適用場景 | 唯讀/歸檔/日誌/報表、全文檢索(舊版本) | 核心業務、高並發讀寫、事務一致性要求高 | 臨時表、查詢緩存中間結果、查找表(數據可重建) | 跨數據中心高可用、強一致性分布式場景 |
| 引擎 | 定位 | 關鍵特性 | 現狀 |
|---|---|---|---|
| ARCHIVE | 歸檔存儲 | 僅支持 INSERT/SELECT、ZLIB 壓縮(壓縮比 1:10)、無索引、全表掃描 | 穩定,日誌/審計落地首選 |
| CSV | 數據交換 | 以 CSV 文件存儲、可直接用表格工具打開、無索引 | ETL 中間表、外部系統對接 |
| BLACKHOLE | 數據黑洞 | 寫入不存儲、直接丟棄、binlog 記錄、可作複製過濾中繼 | 異構同步過濾、壓力測試 |
| FEDERATED | 遠程映射 | 本地建表映射遠程 MySQL 表、查詢推送下推、無本地數據 | 跨實例查詢、遷移雙寫,性能敏感慎用 |
| MERGE (MRG_MYISAM) | 分片聚合 | 將多個同結構 MyISAM 表聚合為一個邏輯表 | 歷史分表查詢兼容,新架構用分區表替代 |
START
│
├─ 需要事務/行鎖/外鍵/崩潰安全? → YES → InnoDB (首選)
│ │
│ ├─ 寫入極大、壓縮需求強? → InnoDB ROW_FORMAT=COMPRESSED / MyRocks
│ │
│ └─ 讀多寫少、全文搜索? → InnoDB 5.6+ 全文索引 / Elasticsearch 外掛
│
├─ 純唯讀/歸檔/日誌/報表、極致壓縮? → ARCHIVE / MyISAM (myisampack)
│
├─ 臨時中間結果、查找表、可重建? → MEMORY (注意容量限制)
│
├─ 跨實例/異構查詢、遷移雙寫? → FEDERATED (延遲高、無索引下推,謹慎評估)
│
├─ 分布式強一致、多活、跨 AZ? → NDB Cluster / TiDB / PolarDB-X
│
└─ 數據交換導入導出? → CSV
END
innodb_file_per_table=ON,大表獨立 .ibd 便於 DISCARD/IMPORT TABLESPACE 快速遷移、回收空間。Innodb_row_lock_waits、Innodb_buffer_pool_wait_free、Key_read_requests(MyISAM)、Memory_used(MEMORY)。SHOW ENGINES 中 MyISAM 標記為 NO(不可用於用戶表仍可用)。