批量导入的首选方式
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,明显拉高主从延迟,并可能挤占磁盘与备份窗口,应选在低峰执行并观察复制状态。
提速与保护
- 导入前可关闭外键与唯一性检查提速,导入后必须立刻恢复
- 按文件或区间拆分导入,避免单个超大事务拖慢复制并造成长回滚
- 导入期间留意进程列表与锁等待,出现阻塞及时暂停