2012-03-26 4 views
0

ソーシャルネットワーク用のフレンドリストテーブルがあるとします。名前、年齢、市などのプロフィール画像のURL、最終ログイン時刻、...キー値ストアとデータベースのデータを最適に結合する方法

ほとんどのユースケースは、次のような個人情報を保持する別のテーブルに結合することがフレンドリストテーブルが必要になります

友人リストテーブルが100M行の範囲に入ったら、このようなJOINのクエリには数秒かかることがあります。あなたが他のいくつかのWHERE条件を導入すると、それはさらに遅くなる可能性があります。

キーバリューストアシステムは、フレンドリストを非常に迅速に持ち込むことができます。

最近ログインした10人の友人を表示したいとします。 この出力を計算する最良の方法は何ですか?私が考えてきたいくつかの方法は以下の通りです。それらのいずれかが理にかなっていますか?

  • すべてのデータをキー値ストア環境に保存しますか?新しいログインごとに のKey-Valueストアを更新しますか?
  • または、友人リストのIDを最初に取得しますか?次に、 "IN()"のようなデータベースコマンドを使用してデータベースを照会しますか?
  • クライアントレベルでデータをマージしますか? JavaScriptのソリューションですか?
+0

友人リストの部分が高速ストレージにあり、結合ではなく「IN」クエリを使用します – njzk2

答えて

0

ユーザテーブルには、最後のログインのタイムスタンプを保存するフィールドがあります。あなたのテーブルには友人関係が格納されていて、あなたは1つの関係につき1つの行があり、それは本当にテーブルを長くしています。

このように、これらのテーブルを結合するのは悪いようです。このプロセスを何とか最適化する必要がありますか?答えは:いいえ、必ずしもそうではありません。 DBMSを構築する人々はあなたと同じ問題を抱えており、それらを解決するツールを実装しています。すべてのDBMSには、あなたと私よりスマートなクエリの最適化があります。

したがって、長いテーブルの結合には恥ずかしいことはありません。あなたが最適化しようとする場合:

  • あなたの友人のIDを取得します。
  • あなたの最初の10人の友人の情報をlast_login descでソートし、idが適合する場所(およびその他の条件)をソートします。

テーブルに参加する必要はありませんが、2つのクエリを使用します。したがって、DBMSがスマートな場合は、結合が速くなります(おそらくテストを実行します)。

ページの読み込み後にこのデータをロードするためにajaxを使用すると、ユーザーの操作性が向上しますが、DBのトラフィックは同じになります。

私はこれが助けてくれることを願っています。

編集:ああ、あなたがすでに他のもののために必要な友達のIDを知っていれば、参加する必要はありません。後でAJAX経由で最後のログインリストをロードするjavascriptにIDを渡すことができます。

関連する問題