萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL LOAD DATA INFILE:MyISAM vs InnoDB 導入效能大比拚

同樣 419 萬筆資料,LOAD DATA INFILE 導入 MyISAM 僅需 2.97 秒,InnoDB (預設 innodb_flush_log_at_trx_commit=1) 卻耗時 58.37 秒——差距近 20 倍。本文實測對比並探討調優方向。

測試環境與資料準備

  • 資料:419 萬行,經 SELECT ... INTO OUTFILE 導出文字檔
  • 兩表結構相同:id int, content mediumtext,僅引擎不同
  • InnoDB 關鍵參數:innodb_flush_log_at_trx_commit = 1(預設,最安全)

導入耗時對比

引擎參數設定耗時備註
InnoDBflush_log_at_trx_commit=158.37 秒每筆同步刷盤,最安全
MyISAM預設2.97 秒無事務日誌,極速
InnoDBflush_log_at_trx_commit=256.46 秒改為 2 幾無改善(批量導入仍走 redo log)

深度解析:為何差距如此大?

  • MyISAM:非交易型,導入時直接寫資料/索引檔,無 redo/undo log 開銷。
  • InnoDB:預設 flush_log_at_trx_commit=1 要求每筆提交 fsync 刷盤;批量導入實際上是單一大交易,但仍需大量 redo log 寫入與緩衝池管理。
  • 調大 innodb_buffer_pool_size、innodb_log_file_size、設 innodb_flush_log_at_trx_commit=2 或 0(風險自負)、關閉 unique_checks/foreign_key_checks 可顯著提升 InnoDB 導入速度。

補充:MyISAM 與 InnoDB 六大核心差異

  1. 檔案結構:MyISAM 三檔,InnoDB 表空間 + redo log
  2. 事務支援:MyISAM 無,InnoDB 完整 ACID
  3. 查詢/寫入特性:大量 SELECT 用 MyISAM;大量 INSERT/UPDATE 用 InnoDB
  4. AUTO_INCREMENT:InnoDB 需單獨索引,MyISAM 可聯合索引
  5. COUNT(*):MyISAM 直接讀計數器;InnoDB 全表掃描
  6. 鎖粒度:MyISAM 表鎖;InnoDB 行鎖(條件不明確時升級為表鎖)

結論:純導入/匯入場景 MyISAM 極快;線上業務強烈建議 InnoDB,導入前可暫時調參數或改用 mysqldump --single-transaction + 管道導入。

copyright © 萬盛學電腦網 all rights reserved