核心差異速查表
| 特性 | MyISAM | InnoDB |
| 事務支援 | ❌ 不支援 | ✅ ACID 完整支援 |
| 鎖粒度 | 表鎖 | 行鎖(支援間隙鎖、Next-Key Lock) |
| 外鍵 | ❌ | ✅ |
| 全文索引 | ✅ (5.6+ InnoDB 也支援) | ✅ (5.6+) |
| 崩潰恢復 | ❌ 需手動修復 | ✅ Redo/Undo Log 自動恢復 |
| MVCC | ❌ | ✅ 一致性非鎖定讀 |
| 資料檔案 | .frm/.MYD/.MYI 分離 | 共享表空間或獨立表空間 (.ibd) |
| 適用場景 | 唯讀/多讀少寫、全文搜尋、日誌表 | OLTP 高併發、事務業務、需高可用 |
MyISAM 架構細節
- 非事務引擎,採用「原子操作」保證單條 SQL 完整性
- 預設
AUTOCOMMIT=1,速度比優化後的事務表快 3-5 倍
- 三個檔案:
.frm 結構、.MYD 資料、.MYI 索引
- 適合:資料倉庫、報表、郵件存檔、唯讀查詢服務
InnoDB 架構細節
- 事務安全引擎,支援 Commit/Rollback/Crash Recovery
- 行級鎖 + MVCC,高併發讀寫不阻塞
- 聚簇索引:主鍵即資料順序,二級索引葉子存主鍵值
- Buffer Pool 緩存資料與索引頁,預讀/換出策略優化
- 表空間:
innodb_file_per_table=ON 獨立 .ibd 便於管理
- 預設內建 MySQL 5.1+,5.5+ 為預設引擎
選型決策樹
- 需要事務?(轉帳、訂單、庫存) → InnoDB
- 高併發寫入?(秒殺、即時統計) → InnoDB
- 純唯讀/極少寫入、需全文搜尋 → MyISAM 可考慮
- 不確定 → 預設用 InnoDB,相容性最好、風險最低
混合使用注意
- 單一查詢中可 Join MyISAM 與 InnoDB 表
- 跨引擎事務不支援(InnoDB 事務不覆蓋 MyISAM 表)
- 備份策略不同:MyISAM 需鎖表/文件複製;InnoDB 可熱備份
MySQL 8.0 已移除 MyISAM 相關內部臨時表優化,未來版本可能進一步淘汰。新專案強烈建議全盤 InnoDB。