InnoDB 與 MyISAM 是 MySQL 最常用的兩大引擎,本文以速查表形式濃縮核心差異,供快速決策參考。
| 項目 | InnoDB | MyISAM |
|---|---|---|
| 交易支援 | ✅ 完整 ACID | ❌ 不支援 |
| 鎖粒度 | 行級鎖 | 表級鎖 |
| 外鍵 | ✅ 支援 | ❌ 不支援 (語法忽略) |
| MVCC | ✅ 非阻塞讀取 | ❌ |
| 崩潰恢復 | ✅ 自動 (Redo Log) | ❌ 易損壞,需手動修復 |
| 全文索引 | 5.6+ ✅ | ✅ 成熟 |
| COUNT(*) | 掃描表 | O(1) 秒級 |
| 索引結構 | 聚簇索引 (主鍵即資料) | 非聚簇 (索引存指標) |
| 儲存檔案 | 表空間 (ibdata/.ibd) | .frm/.MYD/.MYI 三檔 |
| 熱備份 | xtrabackup 線上 | 檔案複製 (需鎖表) |
| 壓縮 | 頁面/表壓縮 | myisampack 唯讀 |
| AUTO_INCREMENT | 記憶體計數器 (5.7+ 持久化) | 儲存於 .MYI |
| 組合索引 AUTO_INCREMENT | 需為索引首欄 | 可非首欄 |
| DELETE 刪除 | 逐行刪除、空間回收需 OPTIMIZE | 重建表 (快) |
| LOAD TABLE FROM MASTER | 不支援 | 支援 |
| 場景 | InnoDB | MyISAM |
|---|---|---|
| 高併發讀寫 | ⭐⭐⭐⭐⭐ | ⭐ |
| 主鍵點查 | ⭐⭐⭐⭐⭐ (1次B+Tree) | ⭐⭐⭐⭐ (2次查找) |
| 範圍掃描 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 全表掃描 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ (略快) |
| 大批次匯入 | ⭐⭐⭐ (按主鍵序) | ⭐⭐⭐⭐⭐ (DISABLE KEYS) |
| 唯讀報表 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
myisamchk -r 或 REPAIR TABLE。[ ] 確認所有表有主鍵 (單調遞增 INT/BIGINT 最佳)
[ ] 檢查組合索引順序符合最左前綴
[ ] 移除 MyISAM 特有語法 (FULLTEXT→InnoDB 語法、DISABLE KEYS 移除)
[ ] 設定 innodb_buffer_pool_size = 70-80% 實體記憶體
[ ] 設定 innodb_flush_log_at_trx_commit = 1 (安全) 或 2 (效能)
[ ] 設定 innodb_file_per_table = ON
[ ] 測試:交易回滾、外鍵約束、死鎖處理、大事務
[ ] 壓測:sysbench oltp_read_write 對比
[ ] 監控:緩衝池命中率、鎖等待、死鎖數、磁碟 IO
需要交易/併發/資料安全 → InnoDB;純唯讀/歸檔/全文搜尋(舊版) → MyISAM;預設無腦選 InnoDB。
引擎選型是架構決策,而非參數調優。InnoDB 以行鎖、MVCC、Redo Log 構建現代關係資料庫基石,MyISAM 以簡單、全表掃描快、COUNT(*) 秒級服務特定唯讀場景。理解差異本質,才能做出正確選擇。