首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL MyISAM vs InnoDB 效能實測:AUTOCOMMIT 才是插入速度關鍵

     編輯:MySQL 資料庫相關知識

許多開發者認為 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_NTMyISAMN/A無交易
MyISAM_TSMyISAMN/ABEGIN/COMMIT
INNODB_NA_NBInnoDB0 (關閉)無交易
INNODB_NA_BEInnoDB0 (關閉)BEGIN/COMMIT
INNODB_AU_NBInnoDB1 (開啟,預設)無交易
INNODB_AU_BEInnoDB1 (開啟)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_NT2.11基準
MyISAM_TS2.65-25%
INNODB_NA_NB2.52-19%
INNODB_NA_BE3.86-83%
INNODB_AU_NB43.72-1967% ⚠️
INNODB_AU_BE3.14-49%

核心發現

  1. AUTOCOMMIT=1(預設)且無顯式交易 = 每筆 INSERT 獨立提交 = 極慢(43 秒 vs 2-3 秒)。
  2. 關閉 AUTOCOMMIT(SET AUTOCOMMIT=0)後,InnoDB 無交易模式(2.52 秒)接近 MyISAM(2.11 秒)。
  3. InnoDB 關閉 AUTOCOMMIT + 顯式 BEGIN/COMMIT(3.86 秒)反而比無交易慢,因單一大交易產生大量 Undo Log 與鎖持有時間。
  4. 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 應用的首選引擎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved