私はユーザー生成の投稿のコレクションを持っています。彼らは、次のフィールド可変クエリでMongoDBのインデックスを作成する
_id: String
groupId: String // id of the group this was posted in
authorId: String
tagIds: [String]
latestActivity: Date // updated whenever someone comments on this post
createdAt: Date
numberOfVotes: Number
...some more...
私のクエリは、常にこのような何かを見てが含まれてい...
Posts.find({
groupId: {$in: [...]},
authorId: 'xyz', // only SOMETIMES included
tagIds: {$in: [...]}, // only SOMETIMES included
}, {
sort: {latestActivity/createdAt/numberOfVotes: +1/-1, _id: -1}
});
だから私はいつものgroupIdを照会していますが、唯一時々tagIdsまたはユーザーIDを追加します。私はこれもソートされているフィールドを切り替えています。私の最高のインデックス作成戦略はどのように見えますか?
これまでここで読んできたことから、複数の複合インデックスを作成し、常に{groupId:1、_id:-1}で始めるようにしました。これらはすべてのクエリに含まれているため、良いプレフィックス候補。 ここでは、すべての可能な組み合わせについて新しいインデックスを作成することは、メモリを賢明に考える良い方法ではないと考えています。したがって、私はちょうどそのようにして、インデックスgroupIdと_idだけを保持する必要がありますか?
ありがとうございました。
「複合インデックス」として '_id'を使用するのは実際には意味がありません。それは定義上「ユニーク」なので、他の可能なフィールドは何も差をつけることができません。いったん '_id'でマッチすれば、それだけです!他のキーの組み合わせについては、物事が一般的に使用される場合は、索引に追加する必要があります。 「接頭辞」は、常に一般的に使用されるものと、一致の数を最も減らすものの両方でなければなりません。あなたはどちらの組み合わせを使うべきですか?これは、あなたの質問が実際に何をしているのかの具体的な説明なしに、ここで尋ねるのが広い方法です。 –
あなたが複合インデックスの最後の部分として_idを使用するのは、あなたがそれをソートしているからです。特に、それはタイムスタンプの2倍です。 – Onosa