LOAD DATA 耗時數十分鐘,事務過大導致 Undo Log 膨脹、鎖表久。# 使用 mk-fifo-split (Percona Toolkit) 建立命名管道分片
wget https://www.percona.com/get/mk-fifo-split
perl mk-fifo-split ./huge_data.txt --fifo /tmp/load.fifo --lines 1000000
# 循環讀取管道導入(主庫關閉 Binlog,加速並避免從庫延遲)
while [ -e /tmp/load.fifo ]; do
mysql -e "SET sql_log_bin=0; SET foreign_key_checks=0; SET unique_checks=0;
LOAD DATA LOCAL INFILE '/tmp/load.fifo' INTO TABLE target_table"
sleep 1
done
SET sql_log_bin = 0; -- 不寫 Binlog,極大加速且不傳遞給從庫
SET foreign_key_checks = 0; -- 關閉外鍵檢查
SET unique_checks = 0; -- 關閉唯一性檢查
SET autocommit = 0; -- 手動提交事務(大事務慎用,建議分批提交)
⚠️ 風險提示:關閉檢查可能導致髒數據寫入,務必確保源數據已清洗驗證;導入完成後必須重新開啟並執行一致性校驗。
| 方案 | 引擎 | 耗時 | 備註 |
|---|---|---|---|
| 直接 LOAD | InnoDB | 6m 4s | 基線 |
| 關閉 Binlog+檢查 | InnoDB | 5m 4s | 提速 ~15% |
| FIFO 分片 100萬行/批 | InnoDB | 5m 26s | 可控制並發、便於監控 |
| 關閉 Binlog+檢查 | MyISAM | 3m 25s | MyISAM 批量導入極快,但無事務 |
wc -l 確認行數,head -5 核對字段分隔符、編碼。ALTER TABLE ADD INDEX ... 重建,速度提升 10 倍+。sql_log_bin,從庫自動追趕;或使用 pt-table-sync 修復不一致。