MySQL 採用插件式存儲引擎架構,不同引擎針對不同負載優化。本文對比 4 大主流引擎核心特性、適用場景、選型決策樹,助你在建表時一鍵定型。
| 特性 | InnoDB | MyISAM | Memory | Archive |
|---|---|---|---|---|
| 事務 (ACID) | ✅ 完整支援 | ❌ 不支援 | ❌ 不支援 | ❌ 不支援 |
| 鎖粒度 | 行鎖 | 表鎖 | 表鎖 | 行鎖(僅插入) |
| 外鍵 | ✅ | ❌ | ❌ | ❌ |
| 全文索引 | 5.6+ ✅ | ✅ (傳統優勢) | ❌ | ❌ |
| 壓縮表 | ❌ (頁壓縮/透明壓縮 5.7+) | ✅ myisampack | ❌ | ✅ zlib 壓縮存儲 |
| 崩潰恢復 | ✅ Redo/Undo Log | ❌ 需修復 | ❌ 重啟丟失 | ❌ |
| 熱備份 | ✅ xtrabackup | ✅ 拷貝文件 | ❌ | ✅ 拷貝文件 |
| 數據持久化 | 磁盤 | 磁盤 | 純內存(重啟丟失) | 磁盤 |
| 索引類型 | B+Tree / Fulltext / Spatial | B+Tree / Fulltext / Spatial | Hash / B+Tree | 無 (5.1+) / 5.1- 無 |
| 適用負載 | OLTP 核心業務 | 只讀/只寫/全文 | 臨時表/查找表/緩存 | 日志/歸檔/寫多讀少 |
innodb_file_per_table=1,單表可移植、可 OPTIMIZE TABLE 釋放空間。xtrabackup 物理流備份,不阻塞寫入,支援增量、壓縮、加密。innodb_buffer_pool_size(內存 70%)、innodb_flush_log_at_trx_commit=2、innodb_flush_method=O_DIRECT。myisamchk -r 修復耗時不可控,數據一致性無保障。max_heap_table_size / tmp_table_size(默認 16MB)。INSERT / SELECT,不支援 UPDATE/DELETE/INDEX(5.1 前)。開始 ├─ 需要事務/外鍵/行鎖/崩潰安全? → 是 → InnoDB (95% 場景) │ └─ 否 │ ├─ 純只讀/全文檢索/舊版本? → MyISAM │ ├─ 數據臨時/重啟可丟失/極速查找? → Memory │ ├─ 只寫不改/歸檔/壓縮/海量日志? → Archive │ └─ 其他特殊需求 → 咨詢 DBA 評估 TokuDB/MyRocks/ColumnStore
max_heap_table_size,重啟自動重建腳本。
-- 查看表引擎
SHOW TABLE STATUS LIKE 'tbl_name'\G
-- 修改引擎(重建表,鎖表,大表慎用)
ALTER TABLE tbl_name ENGINE=InnoDB;
-- 建表時指定
CREATE TABLE t (...) ENGINE=InnoDB;
「無特殊理由,全庫 InnoDB」是現代 MySQL 架構的鐵律。只有在明確的邊緣場景(只讀全文、臨時極速、歸檔壓縮)才引入 MyISAM/Memory/Archive,並物理隔離實例,避免參數調優、備份恢復、監控告警的混亂。