大規模な結果セットの取得を伴うシナリオでは、次のような一般的な疑問が生じます。どちらのメソッドがより効率的であることがわかりますか。PDO::fetchAll() または PDO::fetch()ループ?
私たちの最初の仮定は、MySQL の mysql_query( とは異なり、複数のデータベース操作を同時に実行できる PDO の機能により、PDO::fetchAll() が速度の点で優れている可能性があることを示唆しています。 )、一度に 1 つの操作を処理します。しかし、PDO のドキュメントはこの点に関して沈黙を保っており、仮定が不十分です。
この疑問を解決するために、200,000 レコードのデータセットを使用してベンチマークを実施しました。結果は、PDO::fetchAll() が確かに高速なパフォーマンスを提供することを確認しています:
fetchAll : 0.35965991020203s, 100249408b fetch : 0.39197015762329s, 440b
ただし、このパフォーマンスの向上には代償が伴います。 PDO::fetchAll() は、ループ内で PDO::fetch() よりもはるかに多くのメモリを必要とします。
ベンチマークを複製するには、次のコードを利用できます。
$dbh = new PDO('mysql:dbname=testage;dbhost=localhost', 'root', ''); $sql = 'SELECT * FROM test_table WHERE 1'; $stmt = $dbh->query($sql); // FetchAll benchmark $start_all = microtime(true); $data = $stmt->fetchAll(); $end_all = microtime(true); // Fetch loop benchmark $data = array(); $start_one = microtime(true); while($data = $stmt->fetch()){} $end_one = microtime(true);
結論として、大規模な結果セットを扱う場合、 PDO::fetchAll() は、ループ内で PDO::fetch() よりもパフォーマンスが向上します。ただし、この改善は、PDO::fetchAll() のメモリ消費量の増加によって相殺されます。したがって、理想的な選択は、アプリケーションの特定の要件、速度とメモリ使用量のバランスによって決まります。
以上がループ内の PDO::fetchAll() と PDO::fetch(): 大規模なデータセットではどちらがより効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。