これは、MySQL PDO プリペアド ステートメントを使用した場合と、単純なクエリを使用した場合のパフォーマンスの低下を簡単に把握するために実行した簡単なテストです。person テーブルには 2801 行あります。MySQL バージョン 5.5.28 および PHP バージョン 5.3.15。デフォルトのパラメーターが何であれ、バニラのインストール。テストは 8GB の iMac で実行されます。
$pdo = new PDO('mysql:host=localhost;dbname=cwadb_local', 'root', "");
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$pdo->query("select * from person where name_last = 'smith' or true");
}
echo "<p>query: " . (microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$stmt = $pdo->prepare("select * from person where name_last = :last or true");
$stmt->execute(array('last' => 'smith'));
}
echo "<p>prepare/execute: " . (microtime(true) - $start);
これが出力でした:
query: 21.010436058044
prepare/execute: 20.74036192894
これはまったくペナルティを示しません。可能性:
準備されたステートメントのキャッシュは実際に機能しています。(準備関数をループ内に保持していることに注意してください。)
単純すぎるので、偽のテストです。
準備/実行を遅くすべきという理論的な理由はありません。また、絶え間ない批判にうんざりして、MySQL/PDO/PHP の開発者は、私たち全員を黙らせようとして、より速くするために多大な努力を払ってきました。
他の?
プリペアド ステートメントを使用する方がクエリを使用するよりも安全であり、PDO の名前付きパラメーター (Mysqli にはありません) を使用すると、パラメーターを処理するのが非常に便利であると、ここで何度も言われています。ただし、ステートメントを実行するたびにステートメントを準備する必要がある場合、パフォーマンスが低下することもよく指摘されています。
それで、誰かが私の単純なテストと矛盾するいくつかのテストを提供できますか? それとも、プリペアード ステートメントを使用しない理由がないことを認めましょうか?