InnoDB 與 MyISAM 是歷史最悠久、應用最廣的兩大引擎。本文從事務、鎖、索引、統計、維護五個維度深度對比,助你根據業務特徵做正確選型。
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支持 | ❌ 不支持 | ✅ ACID 完整支持 |
| 行級鎖 | ❌ 僅表鎖 | ✅ 行鎖(含間隙鎖) |
| 外鍵約束 | ❌ | ✅ |
| 全文索引 | ✅ (5.6 前) | ✅ (5.6+) |
| COUNT(*) 性能 | ✅ O(1) 直接讀取 | ❌ 全表掃描(無 WHERE) |
| 崩潰恢復 | ❌ 依賴 myisamchk | ✅ Redo/Undo Log 自動恢復 |
| 壓縮表 | ✅ myisampack | ✅ 行壓縮/頁壓縮 |
myisampack 生成唯讀壓縮表極快。AUTO_INCREMENT 可建立聯合索引(InnoDB 必須單列索引)。WHERE 時需掃描聚簇索引。對策:維護計數表或用 SELECT COUNT(1) FROM tbl WHERE id>0 利用二級索引。OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建。mysqldump 或原生復制。UPDATE ... WHERE name LIKE '%abc%' 無法使用索引 → 全表掃描 → 升級表鎖。對策:避免前置模糊查詢,強制索引。
業務需要事務/外鍵/高並發寫入?
├─ 是 → InnoDB(無腦首選,MySQL 5.7+ 默認)
└─ 否 → 純讀/日志/報表/可容忍數據丟失?
├─ 是 → MyISAM(或 Archive/CSV 引擎)
└─ 否 → InnoDB(通用性更強,生態完善)
同一實例可混用:核心業務表 InnoDB,日志/統計/中間表 MyISAM。注意:跨引擎事務不支持,LOCK TABLES 對 InnoDB 需 SET autocommit=0 配合。