MongoDBは(まだ)インデックスの共通部分をサポートしていないため、ルールは次のとおりです。クエリごとに1つのインデックス。一部のクエリパラメータの選択性は非常に低く、極端な例はブール値であり、それらにインデックスを付けると、通常、速度が上がるのではなく、速度が低下します。
簡単な概算として、{"city"、 "age"、 "mood"、...}などの最も選択性の高いフィールドで始まる複合インデックスを作成できます。ただし、その場合は常に都市の制約を使用する必要があります。{age、mood}をクエリすると、上記のインデックスは使用されません。
インデックスを使用して結果セットを適切なサイズに絞り込むことができる場合、そのセット内のスキャンはパフォーマンスを低下させることはありません。もっと正確に言うlimit(100)
と、MongoDBが200個のアイテムをスキャンして100個を埋める必要がある場合、それは重要ではありません。
危険なのは、データベース全体の非常に狭い検索です。データセット全体をスキャンして、95歳以上の不幸で飲酒している唯一の非喫煙者を見つける必要がある場合、事態は醜くなります。
非常にきめ細かい検索を許可したい場合は、SolRなどの専用検索データベースの方が適している場合があります。
編集:tags
提案は私にはクローバーを使用するのと少し似ています-おそらくMongoDBFAQで推奨されているキー/値マルチキーインデックスはよりクリーンなソリューションです:
{ _id : ObjectId(...),
attrib : [
{ k: "mood", v: "happy" },
{ k: "city": v: "new york" },
{ k: "smoker": v: false },
{ k: "drinker": v: true }
]
}
ただし、YMMVと「clean」および「fast」は同じ方向を向いていないことが多いため、tags
アプローチはまったく悪くない可能性があります。