存儲引擎決定了表的存儲方式、索引策略、鎖粒度、事務支持及恢復能力。本文聚焦生產環境最常用的兩大引擎 —— MyISAM 與 InnoDB,從架構、性能、功能三個維度深度對比,給出明確選型建議。
| 維度 | MyISAM | InnoDB |
|---|---|---|
| 表文件結構 | 三文件: .frm (結構) .MYD (數據) .MYI (索引) | 共享表空間 (ibdata1) 或獨立表空間 (.ibd) .frm 存放於數據庫目錄 |
| 數據存儲位置 | 數據庫目錄下獨立文件 | 共享表空間文件或獨立 .ibd 文件 |
| 可移植性 | 高(直接複製三文件即可遷移) | 需配合 FLUSH TABLES ... FOR EXPORT 或邏輯備份 |
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支持 | ❌ 不支持 | ✅ ACID 完整支持 |
| 外鍵約束 | ❌ 不支持 | ✅ 支持 |
| 全文索引 | ✅ 原生支持 (5.6+) | ✅ 5.6+ 原生支持 |
| 鎖粒度 | 🔒 表級鎖 | 🔒 行級鎖 (默認) |
| MVCC 多版本并發控制 | ❌ | ✅ 讀不阻塞寫,寫不阻塞讀 |
| 崩潰恢復 | ❌ 依賴 OS,易損壞 | ✅ Redo/Undo Log 自動恢復 |
| 聚簇索引 | ❌ 堆表 | ✅ 主鍵聚簇索引 |
| 緩存機制 | Key Buffer (僅索引) | Buffer Pool (數據+索引) |
COUNT(*) 極快(元數據直接返回)COUNT(*) 需全表掃描、全文索引 5.6+ 才成熟LOCK TABLES t READ/WRITE。讀鎖共享,寫鎖排他。并發插入 (concurrent_insert) 可在讀鎖下追加數據。SELECT ... FOR UPDATE (排他鎖)、SELECT ... LOCK IN SHARE MODE (共享鎖)。無索引條件會退化為表鎖。
需要事務/外鍵/高并發寫入? → YES → InnoDB
↓ NO
純讀/日誌/全文搜索/COUNT(*)極快需求? → YES → MyISAM
↓ NO
默認選擇 → InnoDB (MySQL 5.7+ 默認引擎)
Innodb_row_lock_waits、Table_locks_waited 監控鎖爭用。MyISAM 以「輕量、高速讀取」著稱,InnoDB 以「事務、行鎖、高可靠」稱霸。現代 MySQL (5.7/8.0) 已將 InnoDB 確立為絕對主流,除非有極其特定的只讀分析場景,**默認選擇 InnoDB 是最安全、最省心的決策**。