2012-10-23 19 views
6

私はwebshopタイプのアプリケーションで作業しています。他のウェブサイトでよく見られる特徴の1つに、フィルタリングオプションの内訳があります。その後、フィルタリングオプションの結果の合計数が表示されます。コンピュータサイト(Neweggなど)や中古車のサイトでよく表示されます。例:フィルターオプションの合計を効率的にカウントする方法

CPU: 
    * AMD (315) 
    * Intel (455) 

Video card: 
    * ATI (378) 
    * Nvidia (402) 

これらの合計を効率的に計算するにはどうすればよいですか?私が働いているウェブサイトには、多くの異なるオプションを持つ多くの異なる製品(10.000以上)があります。さらに悪いことに、製品は絶えず変化しています。

異なるフィルタリングの組み合わせの合計をすべて事前に計算しようとすると、実用的ではないようです。私がそれぞれ4つのオプションを持つ5つの異なるフィルターを持っている場合、オプションの可能性の数は20 * 16 * 12 * 8 * 4 = 122880になります。それを計算するのに時間がかかるでしょう。

オンデマンドでクエリを実行して結果をキャッシュすることもできます(例:Redis)。しかし、製品を追加したり削除したりすると、キャッシュを効率的に管理できますか?キャッシュはしばしば古くなります。私は、キャッシュの無効化をマイクロ管理する必要があり、何とかして非常に複雑で脆弱な実装につながるのではないかと心配しています。代替方法は、キャッシュの広範なセクションを無効にすることです。しかし無効にした直後に、データベースは、これらの合計を再計算する必要があるアクティブなユーザーからの問い合わせのために急いでしまいます。

これを処理するうえで、エレガントな方法がありますか?

+0

私は主に、適切なインデックスを作成します – NickD

答えて

2

あなたのケースのライブデータを表示するのに問題はありません。どのような方法でもあなたを落胆させることはありませんが、10K製品はパフォーマンスが賢明ではありません。それに対して、何百万というものがあります。

実際にこの方法で実装しようとすると、パフォーマンスがゆっくりと実行されるか、またはその理論的なパフォーマンスについて過度に意識していますか?私はあなたのシステムにある程度のストレステストをして、それが改善する価値があるかどうかを確認することをお勧めします。それでも、ここではより速くそれを作るためにいくつかのアイデアです:

  1. 一度ですべてのカウントを移入しないが、特定のカテゴリが展開されている場合にのみ/クリック。だから、あなたはいつも単一のSELECT cat_name, COUNT(*) GROUP BY cat_nameクエリで終わるでしょう。それは時間がかかりません。このようなユーザーのクリックごとの単一で比較的軽いクエリは、私にとって妥当なものです。

  2. のデータベースエンジンでキャッシュを管理させます。同様のクエリを頻繁に実行する場合、データベースエンジンは自動的に基礎となるストレージを最適化する必要があります(つまり、テーブル全体をメモリなどに移動する必要があります)。インスタンスに十分なメモリがあることを確認するだけです。

  3. 必要に応じてサーバーハードウェアをアップグレードします。。データ量が増えた場合、にはにすべてを保存するための十分なメモリがない可能性があります。まだ慌てないでください。ボトルネックがどこにあるかによって、SSDを入れたり、サーバに12コアのXeonプロセッサをインストールしたりすることができます。

+2

4. :-)合計値を修正していない、彼らはGoogleのようにそれを行うと仮定します。この種のクエリを行うデータベースエンジンに事前に伝えることで、アプリケーションの速度が向上します。データベースエンジンは、インデックスを使用して、ストレージスペース上の小さなペナルティを伴って、操作をより効率的に行います。 – Theraot

0

データベースの数字を維持したり維持したりすることはどうですか?特定のカテーテルに製品が追加/削除された場合は、トリガーを使用してカウンターを自動的に増減させることができます(そうでなければ、店長が販売中の製品を追加/削除できるダイアログで明示的に処理できます) 。

これは、カテゴリーの名前が既にDBに格納されているため、オーバーヘッドがほとんどなく、b)製品が絶えず変化していても、 (ユーザー自身が製品を追加/削除できる場合でも依然として保持する)要求の頻度よりもはるかに低い頻度で変化する可能性があります。最後に、c)複雑なキャッシングスキームはなく、カウンターは単一の場所で、コードの一部で管理されています。エラーのない状態にするのは簡単です。

関連する問題