8

fetchall()PHP の PDO関数のパフォーマンスへの影響に関するいくつかの記事を読んだ後、fetchall().

fetchall()説明すると、ほとんどの人は、リソースを集中的に使用する傾向があることに同意しています。私の場合、それほど大きな問題になるとは思いません。はい、データベースからテーブル全体を取得してユーザーに表示する必要がありますが、最大で約 100 行になります。それが問題になるとは思いません。仮説ですが、100,000 行を取得する必要がある場合、より最適なソリューションは何でしょうか?

4

2 に答える 2

7

仮説として、1 回の応答で 100,000 行すべてを出力する必要がある場合は、 に設定PDO::MYSQL_ATTR_USE_BUFFERED_QUERYし、クエリを実行し、 fetchfalseを使用して一度に 1 行ずつ結果セットを反復する必要があります。詳しく説明すると、 が true に設定されている場合、 fetchAll() を呼び出すかどうかに関係なく、php は結果セット全体をバッファリングします。PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

利点は、スクリプトの最大メモリ消費量を大幅に削減し、完了までの合計時間が長くなる場合とそうでない場合がありますが、出力のストリーミングをより早く開始できることです。

出力バッファリングなど、このような極端な状況で考慮すべき他のことを無視しています...

于 2012-11-04T21:06:29.033 に答える
2

別の方法は、次のように、ループ内で 1 行ずつフェッチすることです。

while( $row = $statement->fetch() ){
    // so something with $row
}

明らかに、すべての行が必要な場合、たとえばそれらを使用していくつかの統計を計算する場合、上記は機能しません。ただし、多くの場合、SQL は、そのような統計をオンザフライで計算し、結果だけを返すことができるソリューションを提供します。

于 2012-11-04T19:55:48.200 に答える