許多開發者認為 MyISAM 天生比 InnoDB 快,實測發現真正關鍵在於 AUTOCOMMIT 設定與交易控制。本文複現實測環境、腳本、結果,揭露 InnoDB 高效寫入的正確姿勢。
測試環境
- OS:RedHat Linux 9
- CPU:4 核心 / 記憶體:2 GB
- MySQL:4.1.6-gamma-standard
- 測試工具:Python + MySQLdb
- 資料量:單次插入 10,000 筆,欄位
TableId INT, TableString VARCHAR(21)
測試表結構(六種組合)
| 表名 | 引擎 | AUTOCOMMIT | 交易控制 |
| MyISAM_NT | MyISAM | N/A | 無交易 |
| MyISAM_TS | MyISAM | N/A | BEGIN/COMMIT |
| INNODB_NA_NB | InnoDB | 0 (關閉) | 無交易 |
| INNODB_NA_BE | InnoDB | 0 (關閉) | BEGIN/COMMIT |
| INNODB_AU_NB | InnoDB | 1 (開啟,預設) | 無交易 |
| INNODB_AU_BE | InnoDB | 1 (開啟) | BEGIN/COMMIT |
測試腳本核心邏輯
# 每次測試前重新連線
# 依表設定 AUTOCOMMIT
if autocommit != None: cursor.execute("SET AUTOCOMMIT = %s", autocommit)
# 若需交易
if trans == 1: cursor.execute("BEGIN")
# 迴圈插入 10000 筆
for i in range(10000):
cursor.execute("INSERT INTO %s (TableId, TableString) VALUES (%%s, %%s)", (tableid, "%020d" % i))
if trans == 1: cursor.execute("COMMIT")
測試結果(耗時秒)
| 表名 | 耗時 | 相對效能 |
| MyISAM_NT | 2.11 | 基準 |
| MyISAM_TS | 2.65 | -25% |
| INNODB_NA_NB | 2.52 | -19% |
| INNODB_NA_BE | 3.86 | -83% |
| INNODB_AU_NB | 43.72 | -1967% ⚠️ |
| INNODB_AU_BE | 3.14 | -49% |
核心發現
- AUTOCOMMIT=1(預設)且無顯式交易 = 每筆 INSERT 獨立提交 = 極慢(43 秒 vs 2-3 秒)。
- 關閉 AUTOCOMMIT(
SET AUTOCOMMIT=0)後,InnoDB 無交易模式(2.52 秒)接近 MyISAM(2.11 秒)。
- InnoDB 關閉 AUTOCOMMIT + 顯式 BEGIN/COMMIT(3.86 秒)反而比無交易慢,因單一大交易產生大量 Undo Log 與鎖持有時間。
- MyISAM 不支援交易,
BEGIN/COMMIT 只是語法兼容,實際無效果,反而略增開銷。
最佳實務建議
批次寫入 InnoDB 黃金法則
-- 1. 關閉自動提交
SET AUTOCOMMIT = 0;
-- 2. 適度批次大小(如 1000-5000 筆)提交一次
BEGIN;
INSERT ... (批次 1);
COMMIT;
BEGIN;
INSERT ... (批次 2);
COMMIT;
-- 3. 結束恢復自動提交
SET AUTOCOMMIT = 1;
- 避免單一超大交易(>1 萬筆)導致鎖升級、Undo Log 膨脹、回滾成本高。
- 使用
LOAD DATA INFILE 或 INSERT ... VALUES (...),(...),... 多行語法進一步提升吞吐。
- 調整
innodb_flush_log_at_trx_commit=2(每秒刷盤)可犧牲 1 秒資料換取極大寫入提升(非金融核心可接受)。
常見誤區澄清
| 誤區 | 事實 |
| InnoDB 就是比 MyISAM 慢 | 關閉 AUTOCOMMIT 後,InnoDB 批次寫入速度可達 MyISAM 90%+,且提供 ACID、行鎖、外鍵、崩潰恢復 |
| 加上 BEGIN/COMMIT 就會變快 | 單一大交易反而慢,需分批次提交 |
| MyISAM 不支援交易所以快 | MyISAM 表鎖、無崩潰恢復、無行鎖,高併發寫入嚴重阻塞 |
結論
InnoDB 並不慢,慢的是「預設自動提交 + 無批次」。正確設定 AUTOCOMMIT=0、分批次提交、調整刷盤策略,InnoDB 即能兼顧高效寫入與資料安全,是現代 MySQL 應用的首選引擎。