針對單表 330 萬行資料,進行單條非同步 UPDATE 壓測,對比 InnoDB 與 MyISAM 存儲引擎的寫入效能。測試環境:Linux, MySQL 5.1,測試過程中伴隨其他系統操作,**數據僅供參考趨勢,非嚴格基準測試**。
| 更新筆數 | 1,000 | 10,000 | 50,000 | 100,000 | 200,000 | 300,000 |
|---|---|---|---|---|---|---|
| MyISAM 耗時 (秒) | 5 | 57 | 142 | 133 | 179 | 300 |
| InnoDB 耗時 (秒) | 1,000 條即耗時 19 秒,後續未測 (極慢) | |||||
innodb_flush_log_at_trx_commit=1 (預設),每次提交強制 fsync 磁碟。innodb_buffer_pool_size 過小,無法缓存熱頁。
[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
UPDATE t SET v=CASE id WHEN 1 THEN 'a' WHEN 2 THEN 'b' END WHERE id IN (1,2,...);SET autocommit=0; UPDATE ...; UPDATE ...; COMMIT;| 場景 | 推薦引擎 | 理由 |
|---|---|---|
| 高併發 OLTP、需事務、外鍵、行鎖 | InnoDB | ACID、MVCC、崩潰恢復、聚簇索引 |
| 唯讀/極少寫、全表掃描報表、全文搜尋 (舊版) | MyISAM | 表鎖開銷小、壓縮表、count(*) 極快 |
| 日誌/監控/暫存、允許丟失、極致寫入速度 | MyISAM / Archive / Blackhole | 無事務開銷 |
**未經調優的 InnoDB 單條 UPDATE 效能極差**,但經過 innodb_flush_log_at_trx_commit=2、足夠 buffer_pool、應用層批次提交後,**InnoDB 寫入吞吐可遠超 MyISAM**,且擁有事務安全與高併發優勢。**不要因預設配置差就否定 InnoDB**;生產環境請務必依據負載特徵調優參數與應用模式。