首页/数据/数据库速查/LOAD DATA 批量导入与 mysqlimport

LOAD DATA 批量导入与 mysqlimport

大批量数据导入的首选:LOAD DATA LOCAL INFILE 读客户端文件,服务端版本读服务器路径;比逐条 INSERT 快一个数量级。

数据库速查数据更新于 2026-10-13

批量导入的首选方式

LOAD DATA 把文本文件按行导入表中,速度比逐条 INSERT 快一个数量级,因为它是批量写入路径、减少了语句解析与网络往返开销。LOCAL 关键字表示读取客户端本地文件(需要客户端与服务端同时允许),不带 LOCAL 时读取的是服务端主机上的路径。

基本信息

适用MySQL 5.7 / 8.0,InnoDB 与 MyISAM 均可用
语法LOAD DATA [LOCAL] INFILE '文件' INTO TABLE 表名
客户端工具mysqlimport,文件名基名需与表名一致
开关服务端 local_infile,客户端也需允许使用 LOCAL

导入 CSV

导入 CSV
SHOW VARIABLES LIKE 'local_infile';   # 先确认服务端开关
LOAD DATA LOCAL INFILE '/tmp/orders.csv'
INTO TABLE orders
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES                          # 跳过表头
(sku, qty, amount);                     # 指定列顺序,与文件列对齐
SELECT COUNT(*) FROM orders;            # 导入后核对行数

命令行工具方式

命令行工具方式
mysqlimport --local -uroot -p appdb /tmp/orders.txt      # 文件基名必须与表名一致
mysqlimport --local -uroot -p --fields-terminated-by=',' --lines-terminated-by='\n' appdb /tmp/orders.txt
wc -l /tmp/orders.txt                                     # 与导入行数对照,确认没有丢行

选项与判据

选项或开关作用注意
LOCAL读取客户端本地文件客户端与服务端都要允许
FIELDS TERMINATED BY字段分隔符与文件实际分隔符一致
ENCLOSED BY字符串包裹符CSV 常为双引号,注意转义
LINES TERMINATED BY行分隔符Windows 换行需写成 \r\n
IGNORE n LINES跳过开头若干行有表头时必须设置
指定列名列表按列顺序导入缺省时按表定义顺序,容易错位

典型使用场景

  • 报表数据入库:大量数据文件一次性导入
  • 数据迁移:从其他系统导出的文本批量装载
  • 测试数据准备:快速构造大表用于压测
  • 分区数据补录:按时间分片分批导入
  • 与 SELECT INTO OUTFILE 配合做数据交换
LOCAL 方式的开关在客户端与服务端两侧都有:8.0 客户端默认允许,服务端默认关闭,云数据库通常也禁用,报错时先查这两处。
大批量导入会产生大量 binlog,明显拉高主从延迟,并可能挤占磁盘与备份窗口,应选在低峰执行并观察复制状态。

提速与保护

  • 导入前可关闭外键与唯一性检查提速,导入后必须立刻恢复
  • 按文件或区间拆分导入,避免单个超大事务拖慢复制并造成长回滚
  • 导入期间留意进程列表与锁等待,出现阻塞及时暂停

易错点

  • 文件列与表列顺序不一致:未显式指定列名会导致数据错列,且不会报错
  • 行分隔符与文件不匹配:Windows 换行的文件按 \n 解析会出现字段错乱
  • 导入时未评估 binlog 影响:主从延迟在导入期间快速攀升,影响下游读库
  • 忽略 local_infile 双侧开关:报错信息笼统,实际是开关未开或权限不足

数据来源与参考

  • MySQL 8.0 Reference Manual: LOAD DATA Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌