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

PHP ループで1 つのクエリをラップする代わりにINSERT、PHP ループを使用して文字列内に1 つ INSERTのクエリを作成し、最後にその 1 つのクエリを実行します。

ヒント: 複数の行を同時にINSERT挿入できます。

単一INSERTは高速ですが、MySQL クエリの結合されたラウンドトリップは、配列要素ごとに接続/通信/解釈/ファイルアクセスのオーバーヘッドを繰り返しているため、常にスケーリングが不十分になります...これらはすべて不必要です.N

于 2013-03-21T12:16:57.400 に答える
4

挿入する行ごとにクエリを実行する代わりに、1つのクエリにすべての行を挿入してみませんか?クエリはそこで支払う高価なコストであり、問​​題を解決するためのものではありません。

次のようなことをしてみませんか。

$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

各レコードの構造が等しいため、複数の値を挿入する 1 つの 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

複数の挿入ステートメントを実行する代わりに、1 つの INSERT ステートメントを作成してから、1 つのステートメントだけを実行します。たとえば、以下を参照してください。

$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 に答える