如何通过批量INSERT与LOAD DATA高效向MySQL大表导入百万条数据?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1013个文字,预计阅读时间需要5分钟。
能,但必须分批,不能一股脑儿塞入一整条百万元的语句。MySQL的`max_allowed_packet`默认通常只有4MB,一行数据按50%字节数计算,10万行就接近5MB,超限直接报错:
关键点:
- 必须显式开启事务:
BEGIN;+ 多条INSERT+COMMIT;,否则每条语句都自动提交,性能断崖下跌 - 避免在插入过程中有二级索引或外键约束,它们会逐行校验,拖慢速度;可考虑先删索引,插完再建
-
INSERT IGNORE或ON DUPLICATE KEY UPDATE会额外增加唯一性检查开销,非必要不用
LOAD DATA INFILE为什么比INSERT快十倍以上?
因为它绕过了 SQL 解析、权限校验、日志格式转换等客户端-服务端交互环节,数据文件由 MySQL 服务端直接读取并写入存储引擎,相当于“裸数据灌入”。实测百万行 CSV 插入,LOAD DATA INFILE 常在 5–10 秒内完成,而等量 INSERT 即使分批也常需 60 秒以上。
本文共计1013个文字,预计阅读时间需要5分钟。
能,但必须分批,不能一股脑儿塞入一整条百万元的语句。MySQL的`max_allowed_packet`默认通常只有4MB,一行数据按50%字节数计算,10万行就接近5MB,超限直接报错:
关键点:
- 必须显式开启事务:
BEGIN;+ 多条INSERT+COMMIT;,否则每条语句都自动提交,性能断崖下跌 - 避免在插入过程中有二级索引或外键约束,它们会逐行校验,拖慢速度;可考虑先删索引,插完再建
-
INSERT IGNORE或ON DUPLICATE KEY UPDATE会额外增加唯一性检查开销,非必要不用
LOAD DATA INFILE为什么比INSERT快十倍以上?
因为它绕过了 SQL 解析、权限校验、日志格式转换等客户端-服务端交互环节,数据文件由 MySQL 服务端直接读取并写入存储引擎,相当于“裸数据灌入”。实测百万行 CSV 插入,LOAD DATA INFILE 常在 5–10 秒内完成,而等量 INSERT 即使分批也常需 60 秒以上。

