2

私はMySQLデータベースと約128,000行のテーブルを持っています(私が理解していることからするとかなり小さいです)。また、ページングを実行するように設定されたアプリケーションが接続されています。私のSQLクエリは次のようになります。

SELECT * FROM Documents WHERE PortfolioId = ? LIMIT ?,?
SELECT * FROM Documents WHERE PortfolioId = ? ORDER BY Date DESC LIMIT ?,?

私の問題は2つあります。まず、使用するクエリに関係なく、最初の「LIMIT」の数値が大きいほど、クエリの戻りが遅くなり、最終的には許容できない遅延になります。たとえば、phpmyadminに移動して実行すると、次のようになります。

SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 0,20

クエリには.001秒かかります。ただし、これを実行すると、次のようになります。

SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 120000,20

クエリには14.8秒かかります。

私の2番目の問題は、日付で並べ替える2番目のクエリ(これもテーブルにインデックスが付けられています)によって、それぞれのクエリにはるかに長い時間がかかることです(最初の例では0.1秒、2番目の例では 2分23秒) )。

これらのクエリを実行してはるかに高速にするためのより良い方法はありますか?私の理解では、開発者は数百万行のテーブルにページングを実装することがよくありますが、このようにすると、後のページが読み込まれるまでに非常に長い時間がかかります。

4

1 に答える 1

1

結果セットに「さらに」入ると、LIMITは常に遅くなります。基本的に、X + 1-> X + 10にのみ関心があるため、最初のX行をフェッチして破棄することとそれほど違いはありません。唯一の違いは、ネットワークを介して不要な行を送信するのに時間を無駄にしないことです。MySQLは、結果セット全体を作成して並べ替えてから、LIMITオフセットポイントまでスクロールダウンする必要があります。オフセットが深いほど、MySQLが実行する必要のある作業が多くなり、基本的には破棄されます。

于 2012-07-15T05:43:06.400 に答える