最常用方案是INSERT...VALUES拼多行,单次500–800行较稳妥;百万级首选LOAD DATA LOCAL INFILE,速度为SQL的5–10倍,但需启用LOCAL_INFILE且注意格式与权限。

直接用 INSERT ... VALUES 拼多行,但别超 1000 行
单条 INSERT 带上百甚至上千组 VALUES 是最常用、兼容性最好、上手最快的方案。MySQL 服务端默认能处理单语句最多约 1000 行(受 max_allowed_packet 和实际字段长度限制),超过就可能报错 Packets larger than max_allowed_packet are not allowed。
实操建议:
- 每次拼 500–800 行比较稳妥,字段越长,行数越要往下压
- 显式开启事务:
START TRANSACTION;+ 插入 +COMMIT;,否则每行都自动提交,性能断崖下跌 - 避免在循环里反复执行
INSERT单行——哪怕用了executeBatch(),底层没开批处理参数(如rewriteBatchedStatements=true)也白搭 - 如果字段含引号、换行、特殊字符,必须正确转义,否则 SQL 语法错误或数据截断
LOAD DATA LOCAL INFILE 是百万级插入的首选
这是 MySQL 官方最高效的批量导入方式,绕过网络解析、SQL 语法分析、权限校验等环节,直接由服务器读文件逐行写入引擎,速度通常是拼 SQL 的 5–10 倍。但要注意:它不是“随便写个 CSV 就能跑”,很多坑卡在第一步。
关键条件和避坑点:
- 客户端连接必须启用
LOCAL_INFILE(PDO 要传PDO::MYSQL_ATTR_LOCAL_INFILE => true;JDBC 要加参数)</li> <li>MySQL 服务端需开启 <code>local_infile=ON
(SHOW VARIABLES LIKE 'local_infile';查),某些云数据库(如阿里云 RDS)默认禁用且不可改 - 文件路径是客户端本地路径,不是服务器路径;Windows 下路径分隔符要用
/或双反斜杠\,否则报File 'xxx' not found - 字段分隔符(
FIELDS TERMINATED BY)和行结束符(LINES TERMINATED BY)必须和文件严格一致,CSV 中有逗号嵌套时务必用ENCLOSED BY
存储过程插入万级数据?慎用,只适合简单造数
用 DELIMITER + WHILE 写存储过程生成测试数据,看起来“全在数据库里”,其实效率极低:每轮循环都是独立 INSERT、触发日志、检查约束、更新索引,10 万条轻松跑十几分钟。你看到的“6.5 秒插 8 万条”前提是字段极简(只有几个 int)、表无索引、关了 autocommit —— 这种场景现实中几乎不存在。
真实环境下建议只用它干一件事:生成固定模式的极简测试码,比如纯数字 ID + 随机字符串,且总量控制在 1 万以内。其他情况不如导文件快。
必要前提:
- 务必
SET AUTOCOMMIT = 0;,并在循环外COMMIT; - 建表前先
ALTER TABLE your_table DISABLE KEYS;,插完再ENABLE KEYS;(仅 MyISAM 有效;InnoDB 不支持该语法,但可临时删非唯一索引) - 避免在循环内调用
NOW()、RAND()等函数多次——它们不是常量,会导致优化器无法复用执行计划
Java/Python 客户端批量插入,核心是开对参数
很多人写了 addBatch() 却没提速,根本原因是 JDBC/驱动没配对。MySQL Connector/J 默认关闭批处理优化,不手动打开,addBatch() 就等于一个个发 INSERT。
必须确认的配置项:
- JDBC URL 加
rewriteBatchedStatements=true(MySQL 8+ 必须加,否则批量变单条) - MyBatis-Plus 的
saveBatch()需配合application.yml中rewriteBatchedStatements=true才生效 - Python 的
pymysql不支持自动重写 batch,得自己拼executemany()或用mysqlclient(底层基于 C API,支持) - 每次
executeBatch()的数据量建议 1000–5000 条,太小浪费网络,太大易 OOM
真正卡住性能的往往不是“怎么写”,而是“在哪写”:本地开发机连远程数据库,网络延迟和带宽会吃掉一半以上时间;而 LOAD DATA LOCAL INFILE 把压力全甩给客户端磁盘 IO,此时 SSD 和 HDD 差距立刻拉开。如果只是造测试数据,优先生成文件再导入,比任何代码循环都可靠。


















