MySQL批量导入数据最常用、最高效的方式是使用
LOAD DATA INFILE语句,配合格式规范的文本文件(如CSV或TSV)。它比逐条
INSERT快数十倍甚至上百倍,特别适合一次性导入万级、百万级数据。
准备结构匹配的文本文件
确保文件字段顺序、类型、分隔符与目标表完全一致。常见要求如下:
每行一条记录,字段间用逗号(或制表符)分隔,行末无多余空格 字符串字段建议用双引号包裹,避免含逗号或换行导致解析错误 日期用YYYY-MM-DD格式,NULL值可写为
\N或留空(需在SQL中指定
SET col = NULLIF(@col, '')) 文件保存为UTF-8无BOM编码,避免中文乱码
启用并执行LOAD DATA INFILE
该命令默认可能被禁用,需确认MySQL配置:
检查secure_file_priv路径:
SHOW VARIABLES LIKE 'secure_file_priv';,只能从该目录下读取文件 把数据文件(如
users.csv)放到该路径下,例如
/var/lib/mysql-files/执行导入(以逗号分隔、首行为字段名为例):
LOAD DATA INFILE '/var/lib/mysql-files/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
处理常见问题与增强控制
遇到报错时,优先排查编码、路径权限和字段映射:
若提示“File not found”,检查文件是否真在secure_file_priv目录,且MySQL进程有读取权限 若中文乱码,建表时用
CHARSET=utf8mb4,并在
LOAD前执行
SET NAMES utf8mb4;需跳过重复主键或唯一键冲突?加
ON DUPLICATE KEY UPDATE逻辑,但
LOAD DATA本身不支持,可改用
INSERT IGNORE配合脚本生成SQL,或先清空再导入 字段数不匹配?可用
SET子句做映射,例如
SET created_at = STR_TO_DATE(@date_str, '%Y-%m-%d')
替代方案:mysqlimport命令行工具
它是
LOAD DATA INFILE的封装,适合运维场景: 语法简洁:
mysqlimport --local --fields-terminated-by=',' --lines-terminated-by='\n' --ignore-lines=1 -u root -p db_name /path/to/users.csv自动匹配表名(文件名去掉扩展名即表名),支持并发导入多个文件 注意加
--local参数,并确保MySQL服务端启用了
local_infile=ON
