これらのドキュメントとインデックスを含むコレクションを作成しようとすると、クエリで説明を実行すると、mongoはインデックス:{field1: 1, field3: 1}
を選択し、他のプランを拒否します。これは、mongoが他のインデックスよりも1つのインデックスを優先することを示しています。
たとえば、次のリターンを説明します。
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field3" : 1
},
"indexName" : "field1_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"field3" : {
"$eq" : "ccc"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1
},
"indexName" : "field1_1_field2_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
]
}
}
},
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1,
"field3" : 1
},
"indexName" : "field1_1_field2_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
}
]
は、しかし、インデックスサイズの問題があり、すべてのインデックスかどうかは、データベースのワーキングセットと一緒にRAMに収まる作成することでしょう。それらがいなければ、ディスク上のインデックスを保持します。これは、読み込みがかなり遅くなります。最高の妥協点は、3つのフィールドすべてでインデックスを使用することです。なぜなら、これはインデックスよりも優れており、3つのインデックスよりメンテナンスが少ないからです。
[explian](https:// docs。 '{field1:1、field3:1}'の索引の有無にかかわらず、これら2つの結果を比較すると、それはあなたにいくつかの手がかりを与えるでしょう。 – zangw
@zangw私はそれを行ったので、それは '[MinKey、MaxKey]'のインデックス境界でインデックスを使用することを知っている理由です。しかし、それは私にパフォーマンス評価を与えません – TomG