| 維度 | InnoDB | MyISAM |
|---|---|---|
| 事務支援 | ✅ ACID 完整支援 (Commit/Rollback/Crash Recovery) | ❌ 不支援,操作即時生效 |
| 鎖粒度 | 行鎖 (Row Lock),高併發優勢 | 表鎖 (Table Lock),寫入串行 |
| 外鍵約束 | ✅ 完整支援 | ❌ 不支援 |
| 全文索引 | 5.6+ 支援 | ✅ 早期支援,功能較舊 |
| 資料檔結構 | 共享表空間 ibdata1 或獨立 .ibd (file_per_table) | 三檔:.frm(結構) .MYD(資料) .MYI(索引) |
| 備份方式 | 熱備份 (xtrabackup/mysqldump --single-transaction) | 冷備份 (複製檔案) 或鎖表 mysqldump |
| Count(*) 效能 | 全表掃描 (MVCC 可見性檢查) | O(1) 直接讀取統計值 |
| 自增主鍵 | 需單獨索引或複合索引首欄 | 可與其他欄位建複合索引 |
| 崩潰恢復 | Redo/Undo Log 自動恢復 | 需手動 REPAIR TABLE / myisamchk |
支援 BEGIN/COMMIT/ROLLBACK、四大隔離級別 (預設 REPEATABLE READ)、一致性非鎖定讀 (Consistent Non-locking Read),讀寫不阻塞,高併發吞吐遠超 MyISAM。
僅鎖定修改行,其他行可並發讀寫。AHI 自動為熱點頁建立 Hash 索引,等值查詢加速。
# 必開啟,便於單表備份、遷移、回收空間
innodb_file_per_table=ON
每表一個 .ibd,DROP TABLE 瞬間釋放磁碟空間,共享表空間 ibdata1 永不縮小。
myisampack)。
-- 錯誤示範:每行 INSERT 獨立事務,極慢
INSERT INTO t VALUES (1); -- 隱含 COMMIT
INSERT INTO t VALUES (2); -- 隱含 COMMIT
-- 10萬行需 10萬次 fsync
-- 正確:批次事務
BEGIN;
INSERT INTO t VALUES (1),(2),...(100000);
COMMIT;
-- 或應用層關閉 autocommit,批次提交
**InnoDB 寫入效能高度依賴事務批次**,單條自動提交是效能殺手。
-- MyISAM → InnoDB (資料不遺失)
ALTER TABLE t ENGINE=InnoDB;
-- InnoDB → MyISAM (失去事務/外鍵)
ALTER TABLE t ENGINE=MyISAM;
大表轉換耗時長,建議低峰期操作,或用 pt-online-schema-change 線上轉換。
InnoDB 是現代 MySQL 核心引擎,事務、行鎖、MVCC、崩潰恢復、獨立表空間構建企業級可靠性。**MyISAM 已退出歷史舞台**,僅存於特定唯讀場景。新專案**無腦選 InnoDB**,並開啟 innodb_file_per_table、合理設定 innodb_buffer_pool_size、使用 --single-transaction 熱備份,即可獲得最佳綜合體驗。