InnoDB 與 MyISAM 是 MySQL 歷史上最核心的兩大儲存引擎。雖然 MySQL 5.5+ 預設為 InnoDB,但理解兩者架構差異、效能特徵、功能邊界,對存量系統遷移、特殊場景選型仍至關重要。本文深度比較並提供決策指南。
| 維度 | InnoDB | MyISAM |
|---|---|---|
| 儲存結構 | 表空間 (ibdata1 + .ibd) / 檔案分表 | 三檔案 (.frm, .MYD, .MYI) |
| 索引結構 | 聚簇索引 (主鍵即資料) + 二級索引存主鍵 | 非聚簇索引 (索引存資料指標) |
| 鎖粒度 | 行級鎖 (Record Lock, Gap Lock, Next-Key Lock) | 表級鎖 (共享讀鎖、獨佔寫鎖) |
| 交易支援 | 完整 ACID、MVCC、Redo/Undo Log | 不支援 |
| 外鍵 | 支援 | 不支援 |
| 崩潰恢復 | Redo Log 雙寫緩衝、Checksum、自動恢復 | 易損壞、需 myisamchk 修復 |
| MVCC | 支援 (非阻塞讀取) | 不支援 |
| 全文索引 | 5.6+ 支援 | 早期支援、成熟 |
| COUNT(*) | 全表掃描 (MVCC 可見性) | O(1) 直接讀取儲存行數 |
| 壓縮 | 頁面壓縮、表壓縮 (Transparent) | myisampack 唯讀壓縮 |
| 熱備份 | xtrabackup/ibbackup 線上熱備 | 檔案複製 (需鎖表/停服務) |
ALTER TABLE ... DISABLE KEYS 後匯入再啟用,極快;InnoDB 建議按主鍵順序匯入MAX(id)+1 (5.7+ 持久化到 redo log)| 引擎 | 單欄索引 | 組合索引 | 行大小限制 |
|---|---|---|---|
| InnoDB (Redundant/Compact) | 767 bytes | 767 bytes | ~8KB (半頁) |
| InnoDB (Dynamic/Compressed, 5.7.7+) | 3072 bytes | 3072 bytes | ~8KB |
| MyISAM | 1000 bytes | 1000 bytes | 65,535 bytes |
ON DELETE CASCADE/SET NULL/RESTRICT/NO ACTION-- 線上轉換 (大表用 pt-online-schema-change)
ALTER TABLE t ENGINE = InnoDB;
-- 關鍵調整
-- 1. 主鍵:確保有單調遞增主鍵 (避免 UUID)
-- 2. 索引:檢查組合索引順序 (最左前綴)
-- 3. 參數:innodb_buffer_pool_size = 70-80% 記憶體
-- 4. 檢查:外鍵、觸發程序、分區表相容性
ALTER TABLE t ENGINE = MyISAM;
-- 風險:失去交易、外鍵、行鎖、崩潰恢復
-- 僅適用:唯讀歸檔表、全文搜尋 (5.6 前)、資料倉儲
預設建議:**99% 場景選 InnoDB**。MyISAM 僅作為特定唯讀/歸檔場景的優化選項。
| 誤區 | 真相 |
|---|---|
| MyISAM 總是比 InnoDB 快 | 僅在「純讀、全表掃描、COUNT(*)」場景;併發寫入 InnoDB 完勝 |
| InnoDB 不支援全文索引 | 5.6+ 完整支援,且支援中文 ngram parser |
| 轉 InnoDB 只需 ALTER TABLE | 需配合參數調優、主鍵設計、索引重構、應用驗證 |
| MyISAM 表損壞無法恢復 | myisamchk -r 可修復大多數,但需停服務、風險高 |
| InnoDB 表空間不可縮減 | 5.7+ 支援 innodb_file_per_table + OPTIMIZE TABLE / ALTER TABLE ... ENGINE=InnoDB 回收空間 |
-- 核心交易系統
CREATE TABLE orders (...) ENGINE = InnoDB;
CREATE TABLE users (...) ENGINE = InnoDB;
-- 唯讀商品目錄 (全文搜尋)
CREATE TABLE products (...) ENGINE = MyISAM;
-- 審計日誌歸檔
CREATE TABLE audit_log_2023 (...) ENGINE = Archive;
-- Session 快取
CREATE TABLE sessions (...) ENGINE = Memory;
InnoDB 已成 MySQL 事實標準,MyISAM 退居特定唯讀場景。選型不應受歷史包袱束縛,而應基於「交易需求、併發模式、資料安全性、查詢模式」四大維度決策。存量 MyISAM 系統建議制定遷移計畫,漸進式轉向 InnoDB,享受現代資料庫架構紅利。