私はスケーラビリティが必要なWebアプリケーションを構築しています。簡単に言えば、組み合わせmysql mongodb
ユーザーがいて、友だちがいるのでフレンドリストがあります。ユーザーはメッセージを作成し、友人からのメッセージはホームページに表示され、各メッセージは場所にリンクされ、これらのメッセージは日付別にフィルタリングできます。たとえば、昨日投稿した場所の友だちからのメッセージをすべて表示する場所Xからのすべてのメッセージを表示してください。
私は現在、アプリケーションをMongoDbに完全に構築していますが、私はatmに問題に陥っています。たとえば:メインページに
- 、我々はユーザーの友人のメッセージリストを持って、何の問題は、我々は使用しません:
$ DB->メッセージ - >「((配列を見つけますusers._id '=>配列(' $ in '=> $ userFriendListGoesHere)));
私たちは私たちのメッセージを受け取りましたが、その後、各メッセージには場所があり、すべてのメッセージをループして別のコレクションから場所を取得する必要があります。私たちはまた、MongoDb 2ループのMySqlで単に別のコレクションからすべてのユーザーデータを取得する必要があります。これは私の最初の質問です:これは問題ですか?これには多くのリソースが必要ですか?
私の考えはMySqlとMongoDbに分割することですが、私はMongoDbを使ってすべての場所を保存します(350.000以上の場所と長時間の計算を使用するため).MySQLはユーザーのメッセージ、ユーザー、 MongoDbをループで使っていけばいいのですか?または組み合わせを使用しますか?
読んでいただきありがとうございます。
SQLでは、1つのクエリを作成し、N個の結果をストリームします。この設定では、1つのクエリを作成し、N個の結果のまとまりを取得し、追加のN個のRPCを追加のデータを参照するようにします。これはほぼ確実に待ち時間/トラフィック・ヒットと比較して、SQLでローカルに実行します。余分なラウンドトリップ回数です。つまり、これらのルックアップのそれぞれは比較的安価でなければならず、何らかの理由でデータをストリーミングした場合(つまり、最初のNを表示してからスクロールして次のNを取得するAJAXリクエストを行うなど)は確かに実現可能です。 。)それはそれを相殺するかもしれません。 – James
4つのテーブルを結合すると、サーバーは4つのインデックス検索+データ検索+一連のメモリ内のforループを実行する必要があります。もしあなたがMongoでそれを行うなら、あなたは引き続き4つのインデックス検索+データルックアップ+ 'for'ループを行います。 SQLのレスポンスは、通常、繰返し(結合に固有の)により多くのデータを必要とします。 Mongoはより多くのクエリを要求するでしょう。パズルの最も遅い部分はドライブですが、これらは同じように見えるので、これは4つの小さなクエリ対1つの大きなクエリ、またはレイテンシとスループットの問題になります。正直言って、どちらが良いか、レイテンシかスループットが良いかわからない。 –