首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL UPDATE 效能實測:InnoDB vs MyISAM 在 330 萬資料量下的驚人差距

     編輯:MySQL 綜合教學

針對單表 330 萬行資料,進行單條非同步 UPDATE 壓測,對比 InnoDB 與 MyISAM 存儲引擎的寫入效能。測試環境:Linux, MySQL 5.1,測試過程中伴隨其他系統操作,**數據僅供參考趨勢,非嚴格基準測試**。

一、 測試結果總覽

更新筆數1,00010,00050,000100,000200,000300,000
MyISAM 耗時 (秒)557142133179300
InnoDB 耗時 (秒)1,000 條即耗時 19 秒,後續未測 (極慢)

二、 關鍵觀察與分析

  1. MyISAM 線性較好: 10 萬筆約 2 分鐘,30 萬筆約 5 分鐘,大致隨筆數線性增長。
  2. InnoDB 極度劣化: 僅 1,000 筆就需 19 秒,推測原因:
    • 未調優 innodb_flush_log_at_trx_commit=1 (預設),每次提交強制 fsync 磁碟。
    • innodb_buffer_pool_size 過小,無法缓存熱頁。
    • 自動提交模式 (autocommit=1) 導致大量微事務。
    • 缺乏批次提交優化。
  3. MyISAM 10萬筆耗時 133s vs 5萬筆 142s 異常: 可能受測試期間系統負載波動影響,非引擎特性。

三、 InnoDB UPDATE 效能優化關鍵參數


[mysqld]
# 核心:緩衝池設為實體記憶體 60-80%
innodb_buffer_pool_size = 4G  # 假設 8G 記憶體

# 關鍵:批次提交減少 fsync
innodb_flush_log_at_trx_commit = 2  # 1=最安全, 2=每秒刷盤(可能丟 1 秒), 0=僅依賴 OS

# 紅寫日誌檔案大小 (減少 checkpoint 壓力)
innodb_log_file_size = 512M
innodb_log_files_in_group = 2

# 允許髒頁比例
innodb_max_dirty_pages_pct = 75

# 併發控制
innodb_thread_concurrency = 0  # 0=不限制
innodb_read_io_threads = 8
innodb_write_io_threads = 8

四、 應用層優化模式 (比調參數更有效)

  1. 批次更新: 累積 N 筆 (如 100-1000) 用單條 SQL:
    UPDATE t SET v=CASE id WHEN 1 THEN 'a' WHEN 2 THEN 'b' END WHERE id IN (1,2,...);
  2. 關閉自動提交,手動事務:
    SET autocommit=0; UPDATE ...; UPDATE ...; COMMIT;
  3. 主鍵順序更新: 避免隨機 I/O 造成頁分裂與鎖競爭。
  4. 覆蓋索引: WHERE 條件欄位建立索引,避免全表掃描。

五、 存儲引擎選型建議

場景推薦引擎理由
高併發 OLTP、需事務、外鍵、行鎖InnoDBACID、MVCC、崩潰恢復、聚簇索引
唯讀/極少寫、全表掃描報表、全文搜尋 (舊版)MyISAM表鎖開銷小、壓縮表、count(*) 極快
日誌/監控/暫存、允許丟失、極致寫入速度MyISAM / Archive / Blackhole無事務開銷

六、 結論

**未經調優的 InnoDB 單條 UPDATE 效能極差**,但經過 innodb_flush_log_at_trx_commit=2、足夠 buffer_pool、應用層批次提交後,**InnoDB 寫入吞吐可遠超 MyISAM**,且擁有事務安全與高併發優勢。**不要因預設配置差就否定 InnoDB**;生產環境請務必依據負載特徵調優參數與應用模式。

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