4

次の表を検討する場合

table_A (id (PK)、値 1、値 2)

たとえば、(1,5)、(1,3)、(3,5) などの一連のデータを挿入する場合

次のようなクエリを実行できます。

INSERT INTO table_A (value1, value2) VALUES (1,5), (1,3), (3,5)

これはうまくいくでしょう。ただし、準備されたステートメントの方が優れていると言われています。準備されたステートメントを見ると、このようなことをしなければならないようです

$stmt = $dbh->prepare("INSERT INTO table_A (value1, value2) VALUES (?, ?)");
$stmt->bindParam(1, $value1);
$stmt->bindParam(2, $value2);

//for each set of values
$value1 = 1;
$value2 = 5;
$stmt->execute();

私の質問は、準備されたステートメントが最初の方法よりも (パフォーマンスに関して) どのように優れているかです。1 つは単一のクエリであり、もう 1 つは同じクエリの複数の実行を伴います。最初のクエリは 3 つの個別のクエリか何かにコンパイルされますか?

4

1 に答える 1

4

一度だけ挿入すると、準備されたステートメント自体は速くなりません。ただし、同じ挿入を複数回実行する必要がある場合は、クエリの解析とクエリ プランの準備にかかる時間を節約できます。準備されたステートメントの挿入は一度解析され、そのプランがキャッシュされ、その後のすべての挿入で再利用されます。一方、複数の値が埋め込まれたステートメントは、新しいステートメントを実行するたびに再処理する必要があり、プロセスが遅くなります。

一方、ネットワーク ラウンドトリップも低速です。追加のラウンドトリップを実行すると、クエリ プランを解析して準備するよりも時間がかかる場合があるため、いずれかの方法で決定を下す前にプロファイリングする必要があります。

于 2012-08-30T00:19:11.027 に答える