0

Railsアプリケーションで直面している問題に対処するための最良のアプローチに関して、誰かが何らかのガイダンスを提供できるかどうか疑問に思っていました.

背景Product私は、約 500,000 行を含む 大規模なデータベースを持っています。ユーザーが のアイテムのサブセクションの情報を表示できるページ (これは「詳細」と呼ばれる) を作成したいと考えていますProduct

Product最初に、アクティブ@matchingproductsなレコードクエリを実行したいと思います@matchingproducts = Product.where(...)

わずかに複雑な点が 2 つあります。

  1. @matchingproducts通常、約 200 レコードが含まれています。一度に 50 件の結果を表示するために paginate を使用しています。
  2. @matchingproductsユーザーが結果を微調整できるように、さらにフィルターを適用できるようにしたいと思います (例: @matchingproducts_filtered = @matchingproducts.where(...))

問題@matchingproductsデータベース全体のクエリ ( Product) が 1 回だけ実行されるように (つまり、「詳細」ページの初期ロード時に) 、変数をどのように定義すればよいですか?

現在、時間のかかるクエリはProduct、次の x レコードを表示するたびに再実行され、ユーザーが指定したpaginate場合と同様に@matchingproducts_filtered

この問題についてご提供いただけるガイダンスをいただければ幸いです。

4

2 に答える 2

1

あなたが行っているページネーションは、製品テーブルのインデックス作成と一緒に行うのが最善の方法です. 一度にすべてのレコードをメモリにロードするという問題も、良い考えではありません。そうする場合、すべての結果を配列に入れ、それに応じてページ付けしたことになります。つまり、常にメモリ内で同期を維持する必要があります。これに関するもう 1 つの問題は、レコード (製品) が更新された場合、メモリ内の配列が更新されるまですぐに表示されないことです。ページネーションは、データベースと連携して行うとうまく機能します。これが意味をなさない場合は、他の解決策を試す必要があると思います。

于 2013-09-04T14:33:50.200 に答える
0

Sergio Tulentsev が述べたように、正しいインデックスが設定されていることを確認する必要があります。500,000 レコードは、最近のハードウェア上の最新の運用品質の DB にとっては膨大な量ではないため、クエリの速度が遅いため、最初に確認することの 1 つになる可能性があります。

多くの関連する関連付け/サブ関連付けなどをロードしている場合は、クエリのインクルードが役立つ n+1 クエリの問題である可能性があります。ログを見て ActiveRecord クエリをデバッグしている場合、単一のリクエストに対して大量のクエリが表示され、コードを見て単一のクエリだと思っていたものが表示される場合があります。これは、n+1 クエリの兆候です。

アソシエーション/サブアソシエーションなどを表示する必要がない場合。なくてもいいかもしれません。

大量の検索/フィルタリングを行っている場合は、Sunspot /SOLR を調べることができます。しかし、それを調査すると、この問題に費やす必要があるよりも多くの初期および繰り返しの時間が消費されるため、現時点ではお勧めしません。はるかに大きなデータセットを使用した複雑でさまざまなクエリを後で使用する場合は、このことを覚えておいてください。

残念ながら、パフォーマンスの向上に関するこれらのタイプの質問は、多くの要因が関与する可能性があるため、実際には自由に回答できますが、これが出発点として役立つことを願っています.

于 2013-09-04T15:14:23.477 に答える