

新闻资讯
行业动态PHP批量插入测试数据应避免循环执行SQL,而用单条INSERT语句配合PDO预处理绑定多组值;也可用SELECT UNION ALL或LOAD DATA INFILE提升性能,并需配合事务控制与索引优化。
PHP 批量插入测试数据,核心是避免循环中反复执行 PDO::exec() 或 mysqli_query(),否则哪怕插 100 条也会触发 100 次 SQL 解析与网络往返,性能断崖式下跌。真正有效的批量插入,必须用单条 INSERT INTO ... VALUES (...), (...), (...) 语句。
prepare() + execute() 批量绑定多组值这是最安全、也最易控制的方式,尤其适合需要防 SQL 注入的场景(比如字段含用户输入或变量)。PDO 本身不原生支持“一次 execute 多组参数”,但你可以手动拼接占位符并一次性传入所有值。
(?, ?, ?) 的 SQL,数量与每批数据行数一致$stmt->execute($allValues) 即可$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$data = [
['name' => 'Alice', 'age' => 25, 'city' => 'Beijing'],
['name' => 'Bob', 'age' => 30, 'city' => 'Shanghai'],
['name' => 'Cindy', 'age' => 28, 'city' => 'Guangzhou']
];
$values = [];
$params = [];
foreach ($data as $row) {
$values[] = "(?, ?, ?)";
$params[] = $ro
w['name'];
$params[] = $row['age'];
$params[] = $row['city'];
}
$sql = "INSERT INTO users (name, age, city) VALUES " . implode(', ', $values);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
INSERT ... SELECT UNION ALL 绕过 VALUES 限制(MySQL)某些老版本 MySQL(如 5.6)对单条 VALUES 子句长度有限制,或你希望完全避免字符串拼接——可用 SELECT ... UNION ALL 构造数据集。这种方式不依赖 PHP 数组拼接,SQL 更“声明式”,也方便后续迁移到存储过程。
SELECT 'val1', 123, 'val3',用 UNION ALL 连接UNION(去重开销大),必须用 UNION ALL
INSERT INTO users (name, age, city) SELECT 'Alice', 25, 'Beijing' UNION ALL SELECT 'Bob', 30, 'Shanghai' UNION ALL SELECT 'Cindy', 28, 'Guangzhou';
LOAD DATA INFILE 导入大批次(万级以上)当你要插入上万条测试数据(比如压测准备),INSERT 再怎么优化也扛不住。此时应切换到 MySQL 原生命令 LOAD DATA INFILE,速度通常是普通 INSERT 的 20 倍以上。但它要求:
LOCAL 关键字,需服务端开启 local_infile=ON)LOAD DATA LOCAL INFILE '/tmp/test_data.csv' INTO TABLE users FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (name, age, city);
批量插入最容易被忽略的点是事务控制和索引影响:不包在 BEGIN/COMMIT 里,每条 INSERT 都会触发独立日志刷盘;插入前没禁用非必要索引,写放大严重。哪怕只是插几百条测试数据,也建议加上 $pdo->beginTransaction() 和 $pdo->commit(),并在建表时确认是否真需要每个字段都加索引。