首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL LOAD DATA 導入大數據全攻略:語法詳解、路徑陷阱、性能優化與實戰技巧

     編輯:MySQL 資料庫相關知識

前言:批量導入的「核彈級」武器

LOAD DATA INFILE 是 MySQL 將文本文件高速載入表的核心語句,速度較 INSERT 快 **20 倍以上**(官方數據)。本文系統梳理完整語法、文件路徑解析規則、字段/行分隔符控制、異常處理策略、索引優化技巧與實戰避坑指南,助您駕馭 TB 級數據導入。

一、完整語法結構圖譜


LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var, ...)]
    [SET col_name = expr, ...]

二、核心子句深度解析

1. LOCAL 關鍵字:客戶端 vs 服務端讀取

模式讀取方文件路徑解析權限要求適用場景
無 LOCALServer 進程服務端主機絕對路徑 / 相對 datadir / 相對當前庫目錄FILE 權限文件已在 DB 服務器,大文件、高性能
LOCALClient 進程客戶端主機路徑(相對啟動目錄)無需 FILE 權限文件在應用/跳板機,跨網絡傳輸

關鍵差異:LOCAL 會將文件內容經網絡發送給 Server,傳輸過程不可中斷,故預設行為等同 IGNORE(重複鍵跳過)。

2. 字段與行分隔符控制


-- 標準 CSV:逗號分隔、雙引號包裹、換行結束
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'

-- Windows 捷徑(\r\n 換行)
LINES TERMINATED BY '\r\n'

-- 自定義多字符行分隔(如日誌 %% 分隔)
LINES TERMINATED BY '\n%%\n'
  • OPTIONALLY ENCLOSED BY:僅字符類型字段加引號;無 OPTIONALLY 則所有字段強制加引號。
  • ESCAPED BY:預設反斜槓 \\,空字符意味著不轉義(危險,慎用)。

3. IGNORE number LINES:跳過標題行


LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

4. REPLACE vs IGNORE:主鍵/唯一鍵衝突策略

關鍵字行為適用場景
REPLACE新行替換舊行(同主鍵/唯一鍵)全量覆蓋同步、數據修正
IGNORE跳過衝突行,保留舊行增量同步、避免主鍵衝突報錯
無指定非 LOCAL 報錯終止;LOCAL 等同 IGNORE嚴格模式、需感知錯誤

5. (col_list) 與 SET:列映射與衍生計算


-- 僅導入指定列,其他列用默認值
LOAD DATA LOCAL INFILE 'persondata.txt' INTO TABLE persondata (col1, col2);

-- 衍生列計算:導入 col3, col4 映射到表 col1, col2,col3 經函數處理
LOAD DATA INFILE 'data.txt' INTO TABLE t1 (col1, col2, @var1)
SET col3 = UPPER(@var1), col4 = NOW();

注意:SET 中只能引用 @user_var,不可前向引用同語句賦值的列。

6. LINES STARTING BY:跳過行前綴


-- 文件內容:
xxx"row",1
something xxx"row",2

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test LINES STARTING BY "xxx";
-- 結果:只導入 ("row",1) 和 ("row",2)

無前綴行將被整行跳過。

三、索引與性能優化:大表導入黃金法則

  1. 空 MyISAM 表批量建索引:LOAD DATA 會延遲非唯一索引創建至載入完成後(類似 REPAIR TABLE),極大加速。無需手動 DISABLE KEYS。
  2. InnoDB 表建議:
    • 按主鍵順序排序數據文件 → 減少頁分裂。
    • SET autocommit=0; LOAD DATA ...; COMMIT; 事務批量提交。
    • 大表考慮 ALTER TABLE ... DISABLE KEYS(僅 MyISAM)或臨時移除二級索引,導入後重建。
  3. 並行導入:將大文件拆分,多會話並行 LOAD DATA 至分區表或不同表,再合併。
  4. bulk_insert_buffer_size(MyISAM)適度調大(如 64M~256M)加速批量插入緩衝。

四、Windows/Linux 換行符陷阱實戰

文件來源行終止符LOAD DATA 設定
Linux/Unix\n (LF)LINES TERMINATED BY '\n' (默認)
Windows (CRLF)\r\nLINES TERMINATED BY '\r\n'
Mac OS 9 (CR)\rLINES TERMINATED BY '\r'

診斷技巧:hexdump -C file.txt | head 或 file file.txt 查看換行符類型。

五、權限與安全邊界

  • 非 LOCAL 模式需 FILE 權限(高危,僅 DBA 持有)。
  • LOCAL 模式下,客戶端讀取文件,**MySQL 服務端無法控制文件來源**,潛在安全風險(CVE-2013-0132 類漏洞)。生產環境建議:
  1. 服務端啟用 local_infile=OFF(默認 5.6+ 為 OFF)。
  2. 應用層下載文件至服務端本地,再用非 LOCAL 模式導入。
  3. 或使用 mysql --local-infile=1 顯式啟用客戶端能力。

六、常見報錯速查

錯誤原因修復
File not found (Errcode: 2)路徑錯誤/相對路徑解析偏差使用絕對路徑;確認 Server/Client 讀取方一致性
Incorrect integer value字段類型不匹配/分隔符錯誤導致列錯位核對 FIELDS/LINES 子句;用 SHOW WARNINGS 定位行
Duplicate entry for key 'PRIMARY'主鍵衝突且未指定 REPLACE/IGNORE添加 REPLACE 或 IGNORE
Packet too large單行超過 max_allowed_packet增大 max_allowed_packet(如 256M)

結語

LOAD DATA INFILE 是數據遷移、ETL、歸檔入庫的「核武器」。掌握「LOCAL 與否」「分隔符精準控制」「衝突策略選擇」「索引延遲建立」「跨平台換行符適配」五大核心技法,配合權限最小化與安全加固,即能在 TB 級數據洪流中,實現**快、穩、準**的精準打擊。願本文成為您數據導入戰場上的「作戰地圖」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved