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

大文件導入 MySQL 實戰:LOAD DATA INFILE 4794 萬行 30 天縮減至小時級

     編輯:MySQL 綜合教學

大文件導入 MySQL 實戰:LOAD DATA INFILE 4794 萬行 30 天縮減至小時級

Java 逐行解析 4G/4000 萬行文本入庫預估 30 天。改用 MySQL 原生 LOAD DATA INFILE 並行導入,實測 **47943428 行** 入庫,耗時數小時。本文記錄導入命令、編碼處理、超時調優、鎖等待處理全過程。

數據格式

每行:主體 ||| 謂語 ||| 賓語
例:北京 ||| 是 ||| 中國首都

導入命令

LOAD DATA INFILE '/home/lenovo/文檔/NLPCC2015/auxiliary-data/NLPCC-2015.Auxiliary.KB.Chinese'
IGNORE INTO TABLE detail_all
CHARACTER SET utf8
FIELDS TERMINATED BY ' ||| '
LINES TERMINATED BY '\n'
(`subject`, `predicate`, `value`);
  • IGNORE:跳過主鍵/唯一鍵衝突行。
  • CHARACTER SET utf8:指定文件編碼,避免隱式轉換。
  • FIELDS TERMINATED BY ' ||| ':多字符分隔符精確匹配。

導入後清洗:去除行尾 \r

UPDATE detail_all SET `value` = TRIM(TRAILING '\r' FROM `value`);

Windows 文本換行 \r\n,LINES TERMINATED BY '\n' 導致 \r 進入最後字段,用 TRIM(TRAILING ...) 清理。

報錯 1:Lost connection (Error 2013)

Error Code: 2013. Lost connection to MySQL server during query (600 sec)

原因:導入耗時超過 net_read_timeout/net_write_timeout(默認 600s)。
解決:

SET GLOBAL net_read_timeout=3600;
SET GLOBAL net_write_timeout=3600;
-- 或 my.cnf 永久調大

報錯 2:Lock wait timeout (Error 1205)

Error Code: 1205. Lock wait timeout exceeded; try restarting transaction

原因:大事務持有鎖超過 innodb_lock_wait_timeout(默認 50s)。
處理:等待阻塞事務回滾完成,或調大 innodb_lock_wait_timeout,或分批導入(每批 100 萬行)。

效果對比

最佳實踐總結

  1. **首選 LOAD DATA INFILE**,MySQL 內部並行、批量寫入、最小化網絡交互。
  2. 文件編碼與 CHARACTER SET 參數顯式一致。
  3. 分隔符、換行符精確匹配文件實際格式。
  4. 大文件調大網絡/鎖超時,或分批導入避免長事務。
  5. 導入後用 TRIM/REPLACE 清洗殘留換行符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案預估耗時實際耗時行數
Java 逐行解析入庫30 天未完成4000萬+
LOAD DATA INFILE數小時~3-4 小時47943428