批量insert比单条insert快5–20倍,推荐用insert into … values (…),(…),(…)方式,结合事务(每1000–5000行提交)和pdo预处理;load data infile最快但限制多,仅适用于本地csv导入。

单条 INSERT 与批量 INSERT 的性能差距明显
执行 1000 条记录插入时,逐条 INSERT INTO ... VALUES (...) 通常耗时是批量插入的 5–20 倍,主要开销在 mysql 网络往返、语句解析、事务日志刷盘和索引维护上。批量插入将多行数据合并进一条 SQL,显著减少客户端与服务端交互次数,也降低锁竞争和日志写入频率。
推荐用 INSERT INTO ... VALUES (...), (...), (...) 方式
这是 php 中最简单高效的批量插入方式,无需额外扩展或配置:
- 每批次控制在 500–2000 行之间(取决于单行数据大小和 max_allowed_packet 设置)
- 拼接 SQL 时注意转义字段值,优先使用 PDO 的
prepare()+execute()绑定参数,避免 SQL 注入 - 示例:一次插入 3 行可写为
INSERT INTO users (name, email) VALUES (?, ?), (?, ?), (?, ?),然后传入 6 个参数
事务包裹能进一步提升吞吐量
默认情况下,每条 INSERT 都是独立事务(autocommit=1),频繁提交会拖慢速度。显式开启事务后批量提交,可减少 redo log 刷盘和 binlog 同步次数:
- 用
$pdo->beginTransaction()开启,$pdo->commit()提交 - 每 1000–5000 行提交一次,避免事务过大导致锁表或内存溢出
- 注意:大事务失败时回滚成本高,建议配合错误捕获与重试逻辑
LOAD DATA INFILE 在特定场景下最快但限制多
若数据已存在本地文件(如 CSV),且 PHP 进程有 MySQL 服务器文件系统访问权限,LOAD DATA INFILE 是最快的方案,速度常比批量 INSERT 快 5–10 倍:
立即学习“PHP免费学习笔记(深入)”;
- 需确保 MySQL 配置中
secure_file_priv允许读取目标路径 - PHP 中通过
PDO::exec("LOAD DATA INFILE '/path/data.csv' ...")执行 - 不适用于动态生成的数据,也无法做字段转换或业务校验,适合 etl 或初始化导入