0

私は、選択のためにユーザーに提示しなければならない何千ものアイテムを含むシステムに取り組んでいます。各ラインアイテムの表示は、多くのデータとオプション/リンクで構成されており、データベース内の多くのテーブルから読み取って、ライン上のすべての情報とリンクをレンダリングする必要があります。そして、何千もの行があります。

したがって、ユーザーが1つだけ選択する場合は、ページに4000個のアイテムを表示する必要がないため、結果のデータセットをフィルタリングまたはページ分割するか、何らかの方法で制限します。

パジネートするとしましょう。ここで私が見ている問題は、たとえば3ページを表示するには、1ページあたりのアイテム数を把握してから、3ページに相当する1ページのみを取得するSQLを作成する必要があることです。表示するリストは次のようになる可能性があることに注意してください。データの多くの列のいずれかでソートされているので、データベースから結果セット全体を要求し、プログラムで3ページから必要な項目だけをピックする必要があるようです。言う方法がないためです。 SQLで、select blah blah blah orderの行30〜40をx、y、zで指定します。

次に、データを取得するという問題があります。必要なすべてのデータを取得して、取得した30〜40行をピックすることで、1回のパスでそれを実行できますが、これはデータベースでの多くの作業であり、そのほとんどを破棄します。

したがって、代わりに、識別子のリストを取得するために1つのパスを実行し、次に、別のはるかに複雑なSQLを作成して、いくつかの行識別子(PKにある方がよい)のIN句を介してこれらの10行に必要なすべてのデータを取得します。 。1ページに2つのパスを実行するのは、非常に遅いアイデアのように思えます。また、データベースに依頼する作業が多ければ多いほど、DBAは私に腹を立てます。したがって、理想はアプリサーバーにできるだけ多くの作業をダンプすることですが、それはもちろん、ネットワークを介してデータベースからアプリサーバーに大量のデータをプルすることを意味します。これも遅い解決策です。

それで、それはより良い方法ですか?または、より適切に機能する別のパラダイムはありますか?

ここで、フィルタリングしているとしましょう。ユーザーには、選択できるいくつかのフィルター基準があります。同じ問題が発生します。ユーザーがすべてのフィルターを削除すると、データベースから実際にデータを大量に消費する4000行が読み込まれることになります。これには、とにかくページネーションを行う必要があります。

ここでの目標は、1ページの情報をレンダリングできるようにするために、多数のテーブルから大量のデータを読み取ることを余儀なくされながら、グーグルのようなページ時間を短縮することです。

時間が経つにつれて、私はグーグルがすることはそれほど複雑ではないことに気付くようになりました。つまり、検索ページの結果セットにはかなり限られたデータセットが含まれているということです。彼らがそのデータを取得する方法が非常に複雑であることは間違いありませんが、特定の検索結果はそれほど多くの情報で構成されていません。

私の問題は、表示しているページの各行に多くの情報があり、すべてのデータが多数のテーブルとデータベースに分散しているという制限に制約されていることです。

それで、私が持っているインフラストラクチャではグーグルのような応答時間を達成することは決してないだろうと気づいていますが、データベースからページの価値のあるデータをレンダリングするための最良の方法は何ですか?

4

1 に答える 1

1

実際には、データベースに「クエリから 30 ~ 40 行を渡してください」と言う方法があります。あなたが探しているのはLIMITOFFSETです。これはおそらく最善の解決策です。これにより、データベースが最も得意とすることを行うことができます。

LIMIT および OFFSET のドキュメント

また、キャッシングについて考えるのに最適な立場にあるようですね。非常にコストのかかる一連のクエリがありますが、それらはすぐには変化しないようです。Memcached などを使用してクエリ結果のコピーを保持すると便利です。

于 2012-08-28T21:57:46.247 に答える