Foreach太慢了

时间:2013-03-21 12:12:58

标签: php mysql arrays foreach

我有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,但在这种情况下太慢了。有什么建议吗?

5 个答案:

答案 0 :(得分:6)

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

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

虽然单个INSERT速度很快,但MySQL查询的组合往返始终会因为重复连接/通信/解释/文件访问而缩小规模每个 N数组元素的开销......所有这些都是不必要的。

答案 1 :(得分:4)

为什么不在一个查询中插入所有行,而不是每行插入一个查询?查询是您在那里支付的昂贵费用,它肯定不是问题的预兆。

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

$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);

答案 2 :(得分: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语句,请阅读documentation

答案 3 :(得分:1)

这很慢,因为每个foreach迭代都会执行1个事务。

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

INSERT INTO tbl_name (a,b) VALUES(1,2),(4,5),(7,8);

答案 4 :(得分:0)

不是运行多个insert语句,而是构建一个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);