2009-07-02 31 views
1

私は、ポインタを移動して現在の 'ページ'を読むことで、ページデータベースを透過的に私のデータベースクラスにロールインする簡単な方法としてmysql_data_seek()を使い始めました。mysql_data_seekのパフォーマンスへの影響

これを実行するとパフォーマンスにどのような影響がありますか?私はPHP自体に必要なデータを読んでいるだけですが、ほとんどの場合、SELECTはテーブル全体をカバーしています - これは悪いですが、大規模なテーブルで問題が発生するでしょうか?

答えて

2

レコードをテーブル内に選択した場合、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プロセスのメモリに全体の結果セットがコピーされた後にのみ返されるということです。レコードが多い場合、 のうち にそれぞれ転送する必要があります。の要求は、最適ではないと思われます。
レコードの合計量を取得するには、 のクエリを1つだけ持つ現在のサブセットを取得したいと思います。MySQLのを使用すると、両方を持つことができ、LIMIT句とレコードの合計数が(つまり、LIMIT句なしで、結果セットになります)、
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

1

私は(それは間違いなく、少なくとも検索時間の節約になります)あなたのSELECT文で適切なLIMIT句を使用すると、より効率的であることを想像し、私はそれがxレコードを読み取り、特に場合は、どのようにmysql_data_seek作品のどのように内部を知っていないとまたはファイルシステムのように動作するかどうかは、seekコマンドが行います(次のxレコードの送信をスキップするように指示するシグナルをMySQLに送信します)。

これが最初の方法であれば、私はこのように最小限のスピードアップを期待します。それが後の方法だったなら、私はスピードアップが期待されますが、単に適切なLIMIT句を使用するだけではありません。

1

唯一気になるのはテーブルサイズです。データベース

  • へのラウンドトリップを保存するか、DBに複数の一口サイズの訪問を作る、単一のResultSetになる/テーブル全体を読み込み

    • 、1:間

      は基本的には、あなたのトレードオフがありますページあたり

    アプリケーションでは、ユーザーが最初の1ページまたは2ページを過ぎることはほとんどないということを意味している場合は、不必要に大きなデータを保存しています。ユーザーがすべてのページにアクセスする傾向があり、多数のページがある場合(新しいページリクエスト/結果セット、つまり動的ページネーションや半永続的なサーバーサイドメモリコンテナを使用している場合)特に複数のユーザー間でキャッシュされている場合は、結果セットを1か所に保持することは問題ありません。しかし

    、あなたのアーキテクチャに、あなたががあなたのクエリで

    ...LIMIT 10,10 
    
    ...LIMIT 20,10 
    

    などのようなものを使用して、おそらく方がいいでしょうということに構築し、複数のDBに苦しむことは読んですることを避けるためにヒットしていない限りあなたが必要とするよりも多くのデータを保存し、不必要に保存します。

  • 1
    私はmysql_seek_dataに行くでしょ

    ()、クエリ実行のコストが高い場合

    通常のページネーションは、2つのクエリ実行 REFを必要とする:[MySQL pagination without double-querying?]

    A))のレコードの総NOが

    Bを返した検索のみ、所望の結果をフェッチするために制限句でクエリを実行するためにクエリを実行

    クエリの実行コストが非常に高い場合は、2回目の実行には向かないでしょうし、mysql_seek_data()関数を選択して成功しました。

    関連する問題