核心差異速查
| 特性 | MyISAM | InnoDB |
| 事務支援 | ❌ | ✅ ACID |
| 鎖粒度 | 表鎖 | 行鎖 |
| 外鍵 | ❌ | ✅ |
| 全文索引 | ✅ (5.6+) | ✅ (5.6+) |
| 崩潰恢復 | ❌ 需手動修復 | ✅ Redo/Undo Log 自動 |
COUNT(*) 無 WHERE | 極快(儲存行數) | 需全表掃描 |
| 空間佔用 | 較小 | 較大(含系統表空間) |
| 並發寫入效能 | 低(表鎖) | 高(行鎖 + MVCC) |
MyISAM 適用場景
- 唯讀/極少寫入:日誌、報表、資料倉儲。
- 需要全文搜尋(舊版唯一選擇)。
- 不需事務、外鍵的簡單應用。
InnoDB 適用場景
- 高併發讀寫、交易系統、金融、電商核心業務。
- 需外鍵約束保證資料完整性。
- 需崩潰安全、支援熱備份(xtrabackup)。
細節差異補充
- FULLTEXT 索引:5.6 前僅 MyISAM 支援,5.6+ 兩者皆支援。
- COUNT(*):MyISAM 直接讀取儲存的行數;InnoDB 掃描索引(可用觸發器維護計數表或 Redis 快取)。
- AUTO_INCREMENT:InnoDB 需單獨索引;MyISAM 允許複合索引首欄。
- DELETE FROM table:MyISAM 重建檔案(快);InnoDB 逐行刪除(慢),大量刪除建議
TRUNCATE 或分批 DELETE ... LIMIT 10000。
- LOAD TABLE FROM MASTER:僅 MyISAM 支援,InnoDB 需改表→導入→改回(會失去外鍵)。
- 行鎖升級表鎖:InnoDB 無法確定掃描範圍時(如
LIKE '%abc%')會鎖全表。
ACID 與隔離級別速覽
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 備註 |
| Read Uncommitted | ✅ | ✅ | ✅ | 極少用 |
| Read Committed | ❌ | ✅ | ✅ | Oracle 預設 |
| Repeatable Read | ❌ | ❌ | ✅ | MySQL InnoDB 預設 |
| Serializable | ❌ | ❌ | ❌ | 效能最低 |
選型決策樹
需要事務/外鍵/高併發寫入? → 是 → InnoDB
↓ 否
純讀取/全文搜尋/極簡應用? → 是 → MyISAM
↓ 否
預設選 InnoDB(MySQL 5.7+ 預設引擎)