ユーザーがたとえば x1 から x100 のリクエストを行い、100 件の結果を取得できると仮定します。たとえば、一度に 10 件の結果でページ分割された結果を表示したいとします。
3つの提案がありますが、それぞれにさまざまなメリットがあります。
キャッシュを実行するには、MySQL に依存します。
MySQL はキャッシングが得意です。同じクエリを何度も繰り返すと、MySQL が結果をキャッシュしようとするため、後続のクエリが非常に高速になります (メモリから取得され、ディスクにアクセスしません)。x1 から x100 へのクエリを実行し、x1 から x10 のみを表示する場合、2 ページ目を表示したい場合は、再度 x1 から x100 へのクエリを実行します。MySQL は独自の内部キャッシュを使用できます。MySQL キャッシングは明らかに RAM を使用するため、効率的にキャッシュできる十分な RAM が DB サーバーにあることを確認する必要があります。キャッシュされると予想されるデータの量を見積もり、これが実現可能かどうかを確認する必要があります。
これは簡単な解決策であり、ハードウェア (RAM) はかなり安価です*。
内部キャッシュ
x1 から x100 の結果全体をアプリケーション (ユーザー セッションなど) に保存し、要求されたページに関連する結果を表示します。これは、MySQL を使用してキャッシュするのと似ていますが、キャッシュを必要な場所に近づけることになります。これを行う場合、キャッシュ管理のようなことを自分で考える必要があります (例: いつキャッシュを失効させるか、メモリ使用の管理など)。これには、ehcache などの既存のキャッシュ ツールを使用できます。
キャッシュの代わりにプリフェッチする
キャッシュには多くのメモリが必要です。キャッシュが実行できない場合は、プリフェッチ戦略を検討することをお勧めします。キャッシュを使用しない場合、応答時間が遅くなる可能性がありますが、プリフェッチを使用すると問題が多少緩和されます。これは、ユーザーが 1 つのページを表示した後、ユーザーが表示する可能性が高い他のページ (通常は次と前) の非同期ルックアップを行う場所です。ルックアップは遅いかもしれませんが、ユーザーが要求する前にそれを行っているので、必要なときにすぐに準備できます。
プリフェッチは、Web アプリケーションではかなり一般的な手法です。ユーザーがページを表示すると、アプリケーションは ajax を使用して、ユーザーが現在のページを表示している間に、バックグラウンドで前後のページを DOM にロードできます。ユーザーが「次へ」のリンクをクリックすると、アプリケーションは DOM を変更して、サーバーにまったく触れることなく、次のページを表示します。ユーザーには、応答が即座に行われるように見えます。
*私はかつてMySQL管理コースを受講していましたが、パフォーマンスのトピックについて、家庭教師は、誰もが最初にすべきことは、サーバーがサポートするのと同じくらい多くのRAMをサーバーに適合させることだと言いました. ほとんどのサーバーは、3 日間のパフォーマンス チューニング コースの費用よりも少ない費用で RAM (数百 Gb を話していました) で満たすことができます。