mysql批量导入数据最高效方式是LOAD DATA INFILE,需文件字段匹配、UTF-8无bom编码、置于secure_file_priv目录;支持字段映射与错误处理,替代方案为mysqlimport命令。

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