Nou, dat doet het eigenlijk ook al is dat in dit geval niet het geval. Om echt te zien wat er gebeurt, moet je kijken naar de "uitgebreide" vorm van uitleggen, door true
toe te voegen :
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
}
],
Kort gezegd, maar het laatste deel is wat u zoekt. Zoals uitgelegd in de handleiding, betekent het verschijnen van "Complex Plan" dat er een kruising wordt gebruikt.
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
Het enige geval hier is dat terwijl het wordt "bekeken" het in dit geval niet door de optimizer wordt gekozen als de meest "optimale" query. Dus de optimizer zegt dat in feite het plan dat alleen de ene geselecteerde index gebruikt, het plan is dat op de meest responsieve manier wordt voltooid.
Dus hoewel de "kruising" werd overwogen, was deze niet de "beste pasvorm" en werd de enkele index gekozen.