3

ユーザーがMySQLデータを検索してページネーションできるようにする分散PHP5アプリケーションがあります。場合によっては、クエリに数十万のレコードが含まれる場合があり、これらは常にタイムスタンプでソートされるため、レコードの量と順序がそのままパフォーマンスに影響します。

ページネーションをより効率的にする必要があります。ずっと前に私SQL_CALC_FOUND_ROWSは a を支持して捨てましたCOUNT(*)が、これはクエリがまだ 2 回実行されることを意味します。1 回は制限あり、もう 1 回は制限なしです。

2 つのクエリを組み合わせて、LIMIT節を使用する代わりに PHP を使用して結果セットのページ付けを行うことができます。更新: 私が作業しようとしている大規模なデータセットは、php に設定されたメモリ制限を超えるため、これは不可能です。これは配布されているため、すべての人に設定を変更してもらうことはできません。

ただし、結果をキャッシュして、そのようにページ分割したいのですが、MySQL に再度クエリを実行するよりもはるかに高速です。これは分散アプリケーションであるため、Memcached などの通常使用するキャッシュ システムはありません。セッション ストレージが小さすぎる可能性があります。

代替手段はありますか?結果をページ分割するより良い方法、または結果をキャッシュして PHP にページ分割させる安全な方法はありますか?

4

1 に答える 1

0

結果の正確な数を表示する必要がありますか? ユーザーに「1000 件以上の結果が見つかりました」といつでも伝えることができます。また、count(*) を実行する場合、必ずしもテーブル内のすべてのレコードを調べるとは限りません。テーブルのインデックスを使用して効率的なカウントを行います。

テーブルが巨大な場合は、いつでもSHOW TABLE STATUSクエリを使用してテーブルに関する情報を見つけることができます。MyISAM テーブルの場合、このコマンドで正確な行数が得られますが、InnoDB の場合はそれほど正確ではない可能性があります。

お役に立てれば

于 2013-04-04T02:56:51.687 に答える