2012-03-13 2 views
2
//Search results for mongo_ids 
    foreach ($results->response->docs as $doc) 
    { 
     $mongo_ids[] = new MongoId($doc->mongo_id); 
    } 
    $search['_id'] = array('$in' => $mongo_ids); 

検索結果に100のmongo idsがあると... mongoのクエリが本当に遅くなるのですか?mongo多数のmongo idsを検索中

答えて

2

_idフィールドはデフォルトでインデックスが付けられているため、INクエリは多数のレコードが一致していても非常に高速でなければなりません。

私は数百のIDを持つ同じ種類のことを行い、パフォーマンスの問題は一度もありません。

+0

コレクションに何千ものドキュメントがある場合はどうすればよいですか?それは遅いでしょうか? – guiomie

+0

何百もOKです。何千人もOKです。数十万はないでしょう。私は〜300Kのドキュメントのデータベースで同じ問題を抱えていましたが、インデックスでさえ、特に一致するIDSのリストが長い – ibtarek

0

もちろん、$inクエリで使用するIDの数が増えるにつれて、問題が増えます。私たちは数千のIDの配列を使ってクエリの実行時間を大幅に短縮しました。あなたはMongoDBのシェルでexplain()機能を使用して(またはラップクエリを使用)して、クエリの実行中にスキャンされているどのように多くのドキュメントを参照することができます

:スキャンした文書の

{"$query" : {"foo" : "bar"}, "$explain" : true}

数の近くに配置してくださいできるだけ返される文書の数。

他の人には便利かもしれない一般的なメモ - $inクエリがまったく必要ない場合もあります。 1つを多数のリレーションにリバースすると、クエリを簡素化できます。あなたの代わりに、以下の構造を有するのユーザーに好まれた曲を、検索する場合たとえば、:

user : 
{ 
    'likes' : [ 
     ObjectId(song_id1), 
     ObjectId(song_id2), 
     ... 
    ] 
} 

あなたが持つことができます。

song : 
{ 
    'likedBy' : [ 
     ObjectId(user_id1), 
     ObjectId(user_id2), 
     ... 
    ] 
} 

を次に、あなただけのために{'likedBy' : ObjectId(yourUserId)}曲を照会することができます(MongoDBは配列内のidを探します)。もちろん状況によって異なりますが、この例は簡単ですが、リレーションを逆にしたり、データの冗長性を追加するなどしてクエリを高速化することができます。

関連する問題