CSV 批量导入的几种方式与速度对比
发布时间:2026-01-11 13:05       
更新时间:2026-01-12 03:26
十万行 CSV 灌进 MySQL,逐条 INSERT 可能要跑十几分钟,LOAD DATA 往往十几秒收工。导入方式差出一个数量级是常态,按数据量和场景选对工具就行。
三种方式
逐条 INSERT:循环里一条条执行,代码最直白,但每条都有网络往返和事务开销,几百行以内无所谓,量大了不可接受。它真正适合的是初始化脚本、配置数据这类几十上百行的小活。
批量 INSERT:把几百上千行拼成一条多值语句:
INSERT INTO t(a,b) VALUES (1,'x'),(2,'y'),(3,'z');
一次往返写多行,速度上一个台阶。注意单条语句受 max_allowed_packet 限制,别一口气拼几十万行。
LOAD DATA INFILE:MySQL 原生批量装载命令,跳过 SQL 解析层直接读文件:
LOAD DATA INFILE '/tmp/data.csv'
INTO TABLE t
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(a, b, @ctime)
SET created = @ctime;
IGNORE 1 LINES 跳过表头,末尾的字段列表完成列映射——CSV 列顺序和表列不一致时,就靠它对齐。
字段映射与转义
实际交付的 CSV 常见三个坑:字段内容带逗号,靠 ENCLOSED BY '"' 包裹处理;内容里带引号,用两个连续双引号转义;Windows 导出的文件换行符是 \r\n,LINES TERMINATED BY 要对应改。中文内容先确认文件是 UTF-8,导入前执行 SET NAMES utf8mb4,避免乱码入库后再返工。格式拿不准,先用 head 看文件前几行,确认分隔符和引号风格,比导完再清洗省事得多。批量报错时看 SHOW WARNINGS 定位具体行。
速度对比
同样十万行,普通配置实例上的经验量级:逐条 INSERT 十分钟级;批量 INSERT(每批一千行)十秒级;LOAD DATA 秒级完成,前后差距 3 到 10 倍很常见。批量 INSERT 相比逐条的提速来自减少网络往返,LOAD DATA 的提速来自完全绕开 SQL 层解析。
选择结论
一次性小导入,批量 INSERT 最顺手,不用碰服务器文件权限。大文件或周期性导入,用 LOAD DATA,注意 local_infile 开关和 FILE 权限的开放范围要收紧到必要账号。无论哪种方式,导完核对行数——SELECT COUNT(*) 的结果对上 CSV 行数(减去表头),导入才算完成。周期性的导入任务,把命令和参数写进脚本进版本库,别只留在某个人的终端历史里。