贝利信息

怎么用mysql实现批量导入数据_mysql实战技巧

日期:2026-01-15 00:00 / 作者:P粉602998670
LOAD DATA INFILE 是最快批量导入方式,但仅读服务器端文件;本地导入需用 LOAD DATA LOCAL INFILE 并开启 local_infile;注意行/字段分隔符、编码(UTF-8 without BOM)、secure_file_priv 限制及索引优化。

LOAD DATA INFILE 语句是最快的方式

直接从本地或服务端文件批量导入数据,比逐条 INSERT 快一个数量级。但注意:它默认只读取 MySQL 服务端的文件系统路径,不是你本地电脑的路径。

LOAD DATA LOCAL INFILE '/path/to/data.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(id, name, email, created_at);

用 INSERT ... VALUES 批量插入时别一次插太多

单条 INSERT 语句带多组值是可以的,但堆叠几万行会触发 max_allowed_packet 限制,也可能锁表太久。

INSERT INTO logs (ts, level, msg) VALUES
(1717023456, 'INFO', 'started'),
(1717023457, 'WARN', 'timeout'),
(1717023458, 'ERROR', 'db fail');

处理编码和特殊字符最容易出错

CSV 或 TXT 文件常因编码不一致导致中文变乱码、字段错位,甚至导入中断。

替代方案:mysqlimport 命令行工具

本质是 LOAD DATA INFILE 的封装,适合运维脚本调用,但灵活性略低。

mysqlimport --local --fields-terminated-by=',' \
  --lines-terminated-by='\n' \
  --ignore-lines=1 \
  --user=root --password \
  mydb /tmp/users.csv
真正卡住人的往往不是语法,而是文件路径权限、编码隐式转换、以及 secure_file_priv 这种默认关死的开关——动手前先 SELECT @@secure_file_priv, @@local_infile; 看一眼,省掉大半排查时间。