LOAD DATA INFILE:比 INSERT 快 10 倍的批量導入利器
基本語法
LOAD DATA [LOCAL] INFILE 'file_path' INTO TABLE tbl_name
[(col1, col2, ...)]
[FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\']
[LINES TERMINATED BY '\n']
[IGNORE number LINES];
兩種執行模式
| 模式 | 命令 | 適用場景 |
| SQL 模式 | LOAD DATA LOCAL INFILE ... | 客戶端與服務端同機/信任網絡 |
| 命令行模式 | mysql --local-infile=1 -e "LOAD DATA ..." | 編譯安裝未啟用 --enable-local-infile 時 |
關鍵參數詳解
LOCAL:文件在客戶端,MySQL 透過協議傳輸;無 LOCAL 則文件須在服務端
REPLACE / IGNORE:主鍵/唯一鍵衝突時,替換或忽略
LOW_PRIORITY:等待無讀鎖時才寫入
FIELDS TERMINATED BY:欄位分隔符(預設 \t)
ENCLOSED BY:引用字符(如 CSV 雙引號)
ESCAPED BY:轉義字符(預設 \)
LINES TERMINATED BY:行結束符(預設 \n)
IGNORE n LINES:跳過前 n 行(如 CSV 標題行)
指定導入欄位(欄位不匹配時必用)
LOAD DATA INFILE '/home/Order.txt' INTO TABLE Orders
(Order_Number, Order_Date, Customer_ID);
實測效能
- 300 萬條資料,LOAD DATA 耗時 **~3 分鐘**
- 同等資料 INSERT 耗時 **30+ 分鐘**
- 建議:導入前
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復
常見錯誤
ERROR 1148 (42000): The used command is not allowed with this MySQL version
-- 解決:啟用 --local-infile=1 或重新編譯加 --enable-local-infile