MySQL 通過插件式架構支持多種存儲引擎,CREATE TABLE ... ENGINE=xxx 表級指定。引擎決定:索引結構、鎖粒度、事務支持、崩潰恢復、壓縮、全文搜索等核心能力。
| 引擎 | 事務 | 鎖粒度 | 索引類型 | 崩潰恢復 | 全文索引 | 外鍵 | 適用場景 |
|---|---|---|---|---|---|---|---|
| ISAM | ❌ | 表級 | B-tree | ❌ (數據文件損壞不可恢復) | ❌ | ❌ | 已棄用,歷史遺留 |
| MyISAM | ❌ | 表級 | B-tree | ⚠️ 工具修復 | ✅ (5.6 前唯一支持) | ❌ | 只讀/讀多寫少、日志歸檔、全文搜索(舊版) |
| MEMORY (HEAP) | ❌ | 表級 | Hash (默認) / B-tree | ❌ (重啟數據全失) | ❌ | ❌ | 臨時表、查找表、會話緩存、數據可重建 |
| InnoDB | ✅ ACID | **行級** | B+ Tree (聚簇索引) | ✅ Redo/Undo Log | ✅ (5.6+) | ✅ | **核心業務首選**、高併發、數據一致性要求高 |
| BDB (BerkeleyDB) | ✅ | 頁級 | B-tree | ✅ | ❌ | ✅ | 已棄用 (MySQL 5.1 移除) |
OPTIMIZE TABLE 碎片整理、myisamchk 修復工具myisampack)、全文索引 (5.6 前)INSERT 失敗中途已寫入數據無法回滾innodb_file_per_table=ON 推薦)
-- 單表轉換 (鎖表重建,大表慎用!生產用 pt-online-schema-change)
ALTER TABLE tbl_name ENGINE = InnoDB;
-- 批量轉換腳本
SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ENGINE=InnoDB;')
FROM information_schema.TABLES
WHERE ENGINE = 'MyISAM' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys');
MySQL 提供 C++ API 開發自定義存儲引擎,可實現 XML 存儲、HTTP 接口、加密存儲等特殊需求。但開發成本極高,維護負擔重,**極少見生產使用**。