測試環境與設計
- 環境:RedHat Linux 9,4 CPU,2GB RAM,MySQL 4.1.6
- 語言:Python + MySQLdb
- 測試:插入 10,000 筆簡單記錄
- 6 種配置組合:MyISAM(事務/無事務)、InnoDB(4 種 AUTOCOMMIT/事務組合)
關鍵發現:AUTOCOMMIT=1 是效能殺手
| 配置 | 耗時(秒) | 相對效能 |
| MyISAM 無事務 | 2.11 | 基準 100% |
| MyISAM 有事務 | 2.65 | 80% |
| InnoDB AUTOCOMMIT=0 無事務 | 2.52 | 84% |
| InnoDB AUTOCOMMIT=0 手動事務 | 3.86 | 55% |
| InnoDB AUTOCOMMIT=1 無事務 | 43.72 | 4.8% |
| InnoDB AUTOCOMMIT=1 手動事務 | 3.14 | 67% |
核心結論
- InnoDB 預設 AUTOCOMMIT=1 導致每 INSERT 都 fsync 刷盤,效能暴跌 20 倍
- 關閉 AUTOCOMMIT + 手動事務 可達 MyISAM 同等級效能
- MyISAM 不支援事務,
BEGIN/COMMIT 只是語法兼容,實際無效
生產環境最佳實踐
-- 連線池初始化時執行
SET SESSION autocommit = 0;
-- 批次寫入模板
START TRANSACTION;
INSERT ...; INSERT ...; ... (批次 1000~5000 行)
COMMIT;
-- 異常時
ROLLBACK;
補充說明
- MySQL 5.6+
innodb_flush_log_at_trx_commit=2 可折衷效能與安全
- 大量匯入建議:
SET unique_checks=0; SET foreign_key_checks=0; 匯入後再開啟
- 使用
LOAD DATA INFILE 效能遠超 INSERT 批次