LOAD DATA INFILE 比 INSERT 快约60倍,实测100万行数据耗时29秒 vs 1832秒;根本原因在于绕过SQL解析、单行事务、网络往返和autocommit开销,但需满足格式规范、文件路径可达及I/O不瓶颈等前提。

LOAD DATA INFILE 比 INSERT 快多少?不是“快一点”,是压倒性优势
实测 100 万行数据,LOAD DATA INFILE 耗时约 29 秒,同等条件下单条 INSERT 要 1832 秒(30 分钟以上),快 60 倍左右。这不是调优结果,而是机制差异:它绕过 SQL 解析、单行事务开销、网络往返和 autocommit 频繁提交。但这个速度只在条件满足时成立——数据格式干净、服务端能读文件、I/O 不瓶颈。
为什么执行就报错 “The used command is not allowed with this MySQL version”?
这不是语法错,是 LOCAL INFILE 被禁用。两种情况必须同时满足:
- 服务端
local_infile系统变量为ON(需 SUPER 权限):SET GLOBAL local_infile = ON - 客户端连接时显式启用:
mysql --local-infile=1 -u root -p,或 Python 中connect(..., local_infile=True)
注意:LOAD DATA INFILE(无 LOCAL)不依赖此开关,但它要求文件路径对 MySQL 进程可读——云数据库(如阿里云 RDS)通常不支持该模式。
字段错位、时间导入失败、最后一列多出 \r?全是分隔符和换行符惹的祸
CSV 格式看似简单,但 Windows 和 Linux 换行符、引号嵌套、空值表示方式稍有偏差,整行就会被跳过或截断,且默认不报错,只藏在 SHOW WARNINGS 里。
- Windows 生成的 CSV,
LINES TERMINATED BY必须写成'\r\n',写成'\n'会导致最后一列末尾残留\r - 字段含逗号(如地址“北京市,朝阳区”)必须配合
ENCLOSED BY '"',否则会切错列 - 时间字段如
"2024-03-15 14:22:08"不能直插,要用SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s') - 首行是标题?加
IGNORE 1 LINES;想跳过唯一键冲突?加IGNORE或REPLACE
InnoDB 表导入前不删索引、不关检查,等于白优化
ALTER TABLE ... DISABLE KEYS 对 InnoDB 完全无效,这是 MyISAM 专属机制。InnoDB 下真正起效的只有三件事,顺序不能乱:
- 先关约束:
SET FOREIGN_KEY_CHECKS = 0、SET UNIQUE_CHECKS = 0 - 再删非主键索引:
DROP INDEX idx_status ON t1(提前用SHOW CREATE TABLE t1备份 DDL) - 导入完成,立刻恢复检查:
SET UNIQUE_CHECKS = 1、SET FOREIGN_KEY_CHECKS = 1,再重建索引
漏掉任何一步,比如只关检查不删索引,导入时仍会触发索引页分裂和唯一键全表扫描,速度几乎没提升。


















