我有一个名为prices
的数组,它有1000个元素,我使用这段代码将它们添加到数据库中:
for (int i = 0; i < 1000; i++) {
$query = "INSERT INTO TABLE data (amount) VALUES";
$query .= " (" . $prices[i] . ");";
mysqli_query($link, $query);
}
虽然它有效,但完成后需要15秒以上,我该怎么做才能优化它?
答案 0 :(得分:5)
从技术上讲,你甚至不需要循环。您只需将所有值插入一个数组:
$query = 'INSERT INTO data (amount) VALUES ';
$valueSets = array_fill(0, count($prices), '(?)');//creates an array containing a (?) string for each price
$pdo = new PDO($dsn, $user, $pass, $attr);
$query .= implode(', ', $valueSets);//concatenate onto query string
$stmt = $pdo->prepare($query);
$stmt->execute($prices);
这就是全部。当然,这不是一个很好的做事方式,所以我可能会使用这样的东西:
$stmt = $pdo->prepare('INSERT INTO data (amount) VALUES (:price)');
foreach ($prices as $price) {
$stmt->execute([':price' => $price]);
$stmt->closeCursor();//optional
}
或者,如果你真的想使用Mysqli:
$stmt = $link->prepare('INSERT INTO data (amount) VALUES (?)');
$price = null;
$stmt->bind_param('i', $price);//bind by reference
foreach ($prices as $price) {
$stmt->execute();//insert price
}
但老实说:这对我来说看起来像DB夹具相关的东西。我只是将价格放在CSV文件或其他内容中,然后运行LOAD DATA LOCAL INFILE
查询而不是编写脚本来插入所有值
答案 1 :(得分:0)
提出数据库请求是一项代价高昂的任务。您应该减少请求的数量。例如,您可以使用类似的请求一次插入多个值。
INSERT INTO TABLE data (amount) VALUES ('v1'), ('v2'), ('v3')
请注意,数据库的设置可能会限制查询的长度。因此,每次100个插入的10个请求或50个插入的20个请求(20x50 = 1000)可以完成这项工作。它会快得多。