MyISAM(非事務、表鎖、全文索引)與 InnoDB(事務、行鎖、外鍵、MVCC)是兩大主流引擎。本文從鎖粒度、事務支援、崩潰恢復、索引結構、備份遷移、自增鎖模式、死鎖行為、適用場景八大維度深度對比,附帶選型決策流程圖與遷移避坑清單。
| 維度 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | ❌ 不支援 | ✅ ACID 完整支援 |
| 鎖粒度 | 表鎖 | 行鎖(基於索引),特定場景升級表鎖 |
| 並發寫入 | 串行,高並發極差 | 高並發優秀,MVCC 非鎖定讀 |
| 崩潰恢復 | 無,需人工修復 | Redo/Undo Log 自動恢復 |
| 外鍵約束 | ❌ | ✅ |
| 全文索引 | ✅ 5.6+ 原生 | ✅ 5.6+ 原生 |
| COUNT(*) | O(1) 直接讀元數據 | O(N) 掃描聚簇索引 |
| 自增列要求 | 可聯合索引 | 必須為索引首列 |
| DELETE 全表 | 重建表,極快 | 逐行刪除,產生大量 Undo |
| 數據文件 | .frm/.MYD/.MYI 分離 | 共享表空間 ibdata1 或獨立 .ibd |
| 備份遷移 | 文件級拷貝極簡單 | 需邏輯備份或 xtrabackup 物理備份 |
| 死鎖 | 無(表鎖串行) | 可能,自動檢測回滾代價較小事務 |
SELECT ... FOR UPDATE (X鎖)、LOCK IN SHARE MODE (S鎖)。SELECT 不加鎖,讀取歷史版本,寫不阻塞讀、讀不阻塞寫。innodb_autoinc_lock_mode(0/1/2)控制並發插入性能與語句複制安全性平衡。S鎖(SELECT ... LOCK IN SHARE MODE),防止父記錄被刪。ALTER TABLE t ENGINE=InnoDB; 會全表重建,大表預留維護窗口或用 pt-online-schema-change。COUNT(*) 變慢,業務若強依賴需改用計數表或觸發器維護。Incorrect column specifier,需先調整索引。MATCH ... AGAINST 在 InnoDB 5.6+ 同樣支援,但分詞器可能不同。