4

我有 2 个数组:

$questions: pid => name
$answers: pid => rid

它在数据库中插入所有问题(pid),如果有答案(rid),则插入答案;如果没有答案,则插入 0。

foreach($questions as $value) {
    $idanswer = ($answers[$value[pid]]) ? $answers[$value[pid]] : 0;
    $idquestion = $value[pid];
    $sql = "INSERT INTO solucion ( rid, pid) VALUES ( '$idanswer ', '$idquestion ')";
    $db - > query($sql);
}

在我缺乏经验的情况下,我几乎对所有事情都使用 foreach,但在这种情况下太慢了。有什么建议吗?

4

5 回答 5

6

不要将单个INSERT查询包装在 PHP 循环中,而是使用 PHP 循环在字符串中构建单个 INSERT查询,然后在最后执行该单个查询。

提示: INSERT可以同时插入行。

尽管单个INSERT速度很快,但 MySQL 查询的组合往返总是难以扩展,因为您正在为每个数组元素重复连接/通信/解释/文件访问开销......所有N这些都是不必要的.

于 2013-03-21T12:16:57.400 回答
4

与其对要插入的每一行运行一个查询,为什么不在一个查询中插入所有行呢?查询是您在那里支付的昂贵费用,这肯定不是 foreach 的问题。

你为什么不按照以下方式去做:

$sql = "INSERT INTO solucion (rid, pid) VALUES ";
$vls = array();
foreach($questions as $value) {
    $idanswer = ($answers[$value[pid]]) ? $answers[$value[pid]] : 0;
    $idquestion = $value[pid];
    $vls[] = " ( '$idanswer ', '$idquestion ')";

}
$sql .= implode(', ', $vls);
$db->query($sql);
于 2013-03-21T12:17:58.720 回答
2

我建议构建一个插入多个值的 INSERT 语句,因为每个记录的结构都相同。

$values = [];
foreach($questions as $value) {
  $idanswer = ($answers[$value[pid]]) ? $answers[$value[pid]] : 0;
  $idquestion = $value[pid];
  array_push($values, "('$idanswer', '$idquestion')");
 }
 $db->query("INSERT INTO solucion (rid, pid) VALUES " . implode(',', $values));

上面的代码片段将构建一个如下形式的 INSERT 语句

INSERT INTO table (column, column) VALUES ('value', 'value'), ('value', 'value')

最好减少插入所有记录所需的数据库命中次数。

有关 INSERT 语句的完整参考,请阅读文档

于 2013-03-21T12:17:09.227 回答
1

这很慢,因为您在每次 foreach 迭代中执行 1 个事务。

在 foreach 循环中构建整个 SQL 语句,然后在 foreach 完成后执行一次。

INSERT INTO tbl_name (a,b) VALUES(1,2),(4,5),(7,8);
于 2013-03-21T12:19:53.247 回答
0

与其运行多个插入语句,不如构建一个 INSERT 语句,然后只运行一个语句。例如见下文。

$query = "INSERT INTO solucion ( rid, pid) VALUES";

foreach($questions as $value) {
    $idanswer = ($answers[$value[pid]]) ? $answers[$value[pid]] : 0;
    $idquestion = $value[pid];
    $query .= " ( '$idanswer ', '$idquestion '),";
}

$query = rtrim($query, ",").";";

$db - > query($sql);
于 2013-03-21T12:21:48.190 回答