ここでは簡単なテストを行い、MySQL PDOのプリペアドステートメントとストレートクエリを使用した場合のパフォーマンスペナルティを簡単に知ることができます。人のテーブルには2801の行があります。 MySQLバージョン5.5.28およびPHPバージョン5.3.15。デフォルトパラメータが何であれ、バニラのインストール。テストは8GBのiMacで実行されます。まったくのペナルティを示していないMySQL PDOはクエリよりも速く準備されていますか?これは単純なテストの結果です
query: 21.010436058044
prepare/execute: 20.74036192894
:
$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);
、これが出力しました。可能性:
準備されたステートメントのキャッシュは実際に動作しています。 (私は準備関数をループ内に保っていたことに注意してください)
これは単純すぎるので偽のテストです。
MySQL/PDO/PHP開発者は、準備/実行が遅くなければならず、絶え間ない批判に疲れているという理論的理由はありません。私たち全員を黙らせようとして。
その他?
プリペアドステートメントを使用してクエリを使用するよりも安全であると、PDO(のMysqliがそれらを持っていない)の名前付きパラメータを使用して、パラメータを扱うことはかなり便利であることを、ここで何度も言われています。しかし、それが実行されるたびに文が準備されなければならない場合には、パフォーマンスのペナルティがあることに注意してください。
誰かが私の簡単なテストに矛盾するいくつかのテストを提供することができますか?あるいは、準備された声明を使わない理由はないと認めますか?
1)恐ろしい2)はい3)「誰が気にしますか?」 - 準備されたステートメントを使用する。 –
それだけの理由から、もう一度クエリを実行してみて、順序を入れ替えてみてください(最初に準備してください)。 – Supericy
準備済みのステートメントは、準備されたステートメントのSQLが毎回同じであることを前提に、準備済みのステートメントがストレート・クエリーよりも_faster_であると予想されます。これにより、クエリ解析がデータベースサーバーにキャッシュされるようになります。これは、準備されていないWHERE句が常に変更されている場合は不可能です。 – halfer