2012-05-04 15 views
1

私はユーザの好みを設定したmongoDBにコレクションを持っています。 1つの特定のコレクションには非常に多数のオブジェクトがあり、ユーザーはコレクション内のキーに従うことができます。たとえば:mongo DBの性能を評価する

colletionx { key1: value1, key2: value2 : key3: value3 .. keyn:valuen} 

は今、ユーザーがキーの任意の数、すなわち、KEY1が等しいとき、いくつかの値が私の更新に従うことができます。 (Twitterの「フォロー」機能と非常によく似ています)。

これを効率的に行うにはどうすればよいですか?私はこのようなクエリでモンゴを問い合わせる場合

また:

db.collection.find({ keyId : 290}) 

またはdb.collection.find({ keyId : { $in [ 290] } })が数百万人のユーザーがあり、すべて1つのショーに続く任意の大幅なパフォーマンスの向上があるだろう。

答えて

1

大量のデータをデータベースに保存する上での最大の懸案事項の1つは、クエリを実行するときにディスクにぶつからないようにすることです。 Mongodbはデータをメモリに保存するのにはかなり良い仕事をしますが、データセットがメモリを超えてしまえば、スワップを開始し、それがあなたのパフォーマンスを損なうでしょう。

照会しているキーにインデックスがある限り、$eqクエリと$inクエリの間に大きな違いはありません。インデックスがない場合は、フルコレクションスキャンを行います。

0

大量のデータの場合は、Sharding とすることをお勧めします。データが断片間に分割されるため、インデックスがラムメモリに収まるようになります。 findOneはインデックスではかなり効率的だと思います。この場合のパフォーマンスを損なう可能性があるのは、読み取り操作に加えて大量の書き込みだけです。 mongoはグローバルロックを持っているので。