私は、ポインタを移動して現在の 'ページ'を読むことで、ページデータベースを透過的に私のデータベースクラスにロールインする簡単な方法としてmysql_data_seek()を使い始めました。mysql_data_seekのパフォーマンスへの影響
これを実行するとパフォーマンスにどのような影響がありますか?私はPHP自体に必要なデータを読んでいるだけですが、ほとんどの場合、SELECTはテーブル全体をカバーしています - これは悪いですが、大規模なテーブルで問題が発生するでしょうか?
私は、ポインタを移動して現在の 'ページ'を読むことで、ページデータベースを透過的に私のデータベースクラスにロールインする簡単な方法としてmysql_data_seek()を使い始めました。mysql_data_seekのパフォーマンスへの影響
これを実行するとパフォーマンスにどのような影響がありますか?私はPHP自体に必要なデータを読んでいるだけですが、ほとんどの場合、SELECTはテーブル全体をカバーしています - これは悪いですが、大規模なテーブルで問題が発生するでしょうか?
レコードをテーブル内に選択した場合、mysql_data_seek()で最初のn *ページレコードをスキップして、現在のページを取得してn個のレコードを読み込みます。もしレコードがたくさんある場合は、http://php.net/mysql_data_seekと言っているので、そのようにしたくないかもしれません:
注:mysql_data_seek()関数は、mysql_query()ではなくmysql_unbuffered_query()でのみ使用できます。mysql_queryバッファされていないバージョンは、mysql_query()がmysql_fetch_xyz()がサーバーから次のレコードを受け取る必要があるバッファされていないバージョンの後に、MySQLサーバーからPHPプロセスのメモリに全体の結果セットがコピーされた後にのみ返されるということです。レコードが多い場合、 をのうち にそれぞれ転送する必要があります。の要求は、最適ではないと思われます。
SELECT SQL_CALC_FOUND_ROWS id FROM foo
ORDER BY id LIMIT 20,10
が見http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
私は(それは間違いなく、少なくとも検索時間の節約になります)あなたのSELECT
文で適切なLIMIT
句を使用すると、より効率的であることを想像し、私はそれがx
レコードを読み取り、特に場合は、どのようにmysql_data_seek
作品のどのように内部を知っていないとまたはファイルシステムのように動作するかどうかは、seek
コマンドが行います(次のx
レコードの送信をスキップするように指示するシグナルをMySQLに送信します)。
これが最初の方法であれば、私はこのように最小限のスピードアップを期待します。それが後の方法だったなら、私はスピードアップが期待されますが、単に適切なLIMIT
句を使用するだけではありません。
唯一気になるのはテーブルサイズです。データベース
は基本的には、あなたのトレードオフがありますページあたり
アプリケーションでは、ユーザーが最初の1ページまたは2ページを過ぎることはほとんどないということを意味している場合は、不必要に大きなデータを保存しています。ユーザーがすべてのページにアクセスする傾向があり、多数のページがある場合(新しいページリクエスト/結果セット、つまり動的ページネーションや半永続的なサーバーサイドメモリコンテナを使用している場合)特に複数のユーザー間でキャッシュされている場合は、結果セットを1か所に保持することは問題ありません。しかし
、あなたのアーキテクチャに、あなたががあなたのクエリで
...LIMIT 10,10
...LIMIT 20,10
などのようなものを使用して、おそらく方がいいでしょうということに構築し、複数のDBに苦しむことは読んですることを避けるためにヒットしていない限りあなたが必要とするよりも多くのデータを保存し、不必要に保存します。
()、クエリ実行のコストが高い場合
通常のページネーションは、2つのクエリ実行 REFを必要とする:[MySQL pagination without double-querying?]
A))のレコードの総NOが
Bを返した検索のみ、所望の結果をフェッチするために制限句でクエリを実行するためにクエリを実行
クエリの実行コストが非常に高い場合は、2回目の実行には向かないでしょうし、mysql_seek_data()関数を選択して成功しました。