LOAD DATA INFILE 语句是最快的方式
直接从本地或服务端文件批量导入数据,比逐条
INSERT快一个数量级。但注意:它默认只读取 MySQL 服务端的文件系统路径,不是你本地电脑的路径。 如果用
LOAD DATA INFILE,文件必须放在 MySQL 服务器所在机器上,且 MySQL 进程有读取权限 想从客户端本地导入?改用
LOAD DATA LOCAL INFILE,但需服务端开启
local_infile=ON(在
my.cnf中配置并重启,或运行
SET GLOBAL local_infile = ON,后者需要
FILE权限) 字段分隔符、行结束符要和文件实际格式严格一致,常见错误是 Windows 的
\r\n和 Linux 的
\n混用导致最后一列丢失
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限制,也可能锁表太久。 推荐每批 1000–5000 行,具体看单行数据大小;可通过
SHOW VARIABLES LIKE 'max_allowed_packet';查当前上限 确保目标表没有过多索引,尤其是唯一索引——每插一行都会校验,批量时开销翻倍 导入前可临时禁用唯一性检查:
SET unique_checks=0;,导入后再
SET unique_checks=1;(记得配合
COMMIT,否则可能不生效)
INSERT INTO logs (ts, level, msg) VALUES (1717023456, 'INFO', 'started'), (1717023457, 'WARN', 'timeout'), (1717023458, 'ERROR', 'db fail');
处理编码和特殊字符最容易出错
CSV 或 TXT 文件常因编码不一致导致中文变乱码、字段错位,甚至导入中断。
务必确认文件是UTF-8 without BOM;用
file -i filename或 VS Code 底部编码提示验证 建表时显式指定字符集:
CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;导入语句中加上
CHARACTER SET utf8mb4,否则即使表支持,
LOAD DATA仍可能按默认
latin1解析 字段含逗号、换行、双引号时,必须用
ENCLOSED BY '"'并确保导出程序做了正确转义
替代方案:mysqlimport 命令行工具
本质是
LOAD DATA INFILE的封装,适合运维脚本调用,但灵活性略低。 文件名必须和表名一致(如导入到
orders表,文件得叫
orders.txt),除非加
--fields-terminated-by等参数覆盖 不支持跳过首行(
IGNORE 1 ROWS),需提前用
sed或
tail -n +2处理 权限模型和
LOAD DATA INFILE一致,同样受
secure_file_priv限制——查
SELECT @@secure_file_priv;知道能读哪些路径
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;看一眼,省掉大半排查时间。
