2

ここでこの質問を参照してください:

私はメインデータベースとしてmongodbを使用して同様のサイトで作業しています。ご想像のとおり、各ユーザーオブジェクトには、たとえば気分、都市、年齢、性別、喫煙者、飲酒者など、検索可能にする必要のある多くのフィールドがあります。

さて、コレクションごとに64を超えるインデックスが存在できないという問題は別として、すべてのフィールドにインデックスを割り当てるのが賢明ですか?

それを行う別の実行可能な方法があるかもしれません:タグ(この他の質問を参照してください)事前に定義されたタグの配列にインデックスを設定してから、それらをテキスト検索する場合、それはより良いでしょうか?インデックスを1つだけ使用しているため。どう思いますか?例えば:

{
   name: "john",
   tags: ["happy", "new-york", "smoke0", "drink1"]
}
4

1 に答える 1

2

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アプローチはまったく悪くない可能性があります。

于 2013-03-25T16:43:53.777 に答える