load data infile 慢主要源于索引维护、约束校验(unique_checks/foreign_key_checks)和日志刷盘频率;innodb 应删索引再重建,禁用 disable keys 无效;需检查 secure_file_priv、字段格式及时间/数值解析。

LOAD DATA INFILE 为什么慢?先看瓶颈在哪
不是所有“慢”都该关索引。真正拖慢 LOAD DATA INFILE 的,通常是三类开销:索引维护(尤其非唯一二级索引)、约束校验(UNIQUE_CHECKS、FOREIGN_KEY_CHECKS)、日志刷盘频率(innodb_flush_log_at_trx_commit)。单次导入不到 1 万行,或表本身只有主键+1 个索引,关索引收益微乎其微,反而增加恢复风险。
禁用索引要分引擎,InnoDB 和 MyISAM 完全不同
ALTER TABLE t DISABLE KEYS 对 InnoDB 表基本无效(5.7+ 仅在极少数路径下触发),别白试。MyISAM 才真正支持它——导入前执行,导入后 ENABLE KEYS 一次性重建非唯一索引,速度飞跃。
- InnoDB 正确做法是:
DROP INDEX idx_name ON t,导入完再CREATE INDEX;主键和唯一索引不能删,否则数据可能损坏 - 外键约束可临时关:
SET FOREIGN_KEY_CHECKS = 0,但必须确认源数据已满足外键逻辑,否则导入后查不到关联记录 - 唯一性校验可关:
SET UNIQUE_CHECKS = 0,前提是确认无重复主键/唯一键值,否则冲突行会被静默丢弃或报错
缓冲区调大不等于更快,关键看哪个参数
innodb_buffer_pool_size 主要影响读性能,对纯写入的 LOAD DATA 提速有限;真正起效的是日志相关参数:
-
innodb_log_buffer_size:设为16M~256M,减少日志写入磁盘次数;注意它不需重启,但过大可能浪费内存 -
innodb_log_file_size:建议调到1G~2G,需重启生效;太小会导致频繁 checkpoint,卡住导入 -
read_buffer_size和sort_buffer_size可适当加大(如4M),但超过32M后边际收益骤降,还可能挤占其他连接内存
文件路径、格式和字段映射最容易出 silent 错误
没报错 ≠ 导入成功。常见陷阱包括:
- 文件不在
secure_file_priv指定目录下 → 报错ERROR 1290 (HY000);查路径用SHOW VARIABLES LIKE 'secure_file_priv' - CSV 里有逗号在引号内,但没设
ENCLOSED BY '"'→ 字段错位,整行被跳过,只在SHOW WARNINGS里提示Data truncated - 时间字段含空格或非法字符 → 自动转成
'0000-00-00',且不报错;必须用SET col = STR_TO_DATE(@var, '%Y-%m-%d %H:%i:%s')显式解析 - 数值字段带千分位逗号或货币符号 → 先用
REPLACE(@val, ',', '')清洗,再转数字
真正难调的从来不是参数,而是你不知道哪一行数据悄悄坏了格式,又恰好没报错。











