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