この場合はそうではありませんが、実際にはそうです。何が起こっているのかを実際に確認するには、true
を追加して、「詳細」形式のExplainを確認する必要があります。 :
db.t.find({item:"abc123",qty:{$gt:15}}).explain(true)
{
"cursor" : "BtreeCursor item_1",
"isMultiKey" : false,
"n" : 84,
"nscannedObjects" : 100,
"nscanned" : 100,
"nscannedObjectsAllPlans" : 201,
"nscannedAllPlans" : 304,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 2,
"nChunkSkips" : 0,
"millis" : 2,
"indexBounds" : {
"item" : [
[
"abc123",
"abc123"
]
]
},
"allPlans" : [
{
"cursor" : "BtreeCursor item_1",
"isMultiKey" : false,
"n" : 84,
"nscannedObjects" : 100,
"nscanned" : 100,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0,
"indexBounds" : {
"item" : [
[
"abc123",
"abc123"
]
]
}
},
{
"cursor" : "BtreeCursor qty_1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 101,
"nscanned" : 102,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0,
"indexBounds" : {
"qty" : [
[
15,
Infinity
]
]
}
},
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
],
短く切りますが、最後の部分はあなたが探しているものです。マニュアルで説明されているように、「複雑な計画」の外観は、交差点が使用されていることを意味します。
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
ここでの唯一のケースは、「調べられている」間、オプティマイザーによって最も「最適な」クエリとして選択されていないことです。したがって、オプティマイザーは、実際には、選択した1つのインデックスのみを使用する計画が、最も応答性の高い方法で完了する計画であると言っています。
したがって、「交差点」が考慮されましたが、それは「最適」ではなく、単一のインデックスが選択されました。