Cóż, rzeczywiście tak jest, chociaż w tym przypadku tak nie jest. Aby naprawdę zobaczyć, co się dzieje, musisz spojrzeć na „pełną” formę wyjaśnienia, dodając true
:
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
}
],
Krótko, ale ostatnia część jest tym, czego szukasz. Jak wyjaśniono w instrukcji, pojawienie się „Planu złożonego” oznacza, że używane jest skrzyżowanie.
{
"cursor" : "Complex Plan",
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 102,
"nChunkSkips" : 0
}
Jedynym przypadkiem jest to, że podczas „patrzenia” nie jest w tym przypadku wybierane przez optymalizator jako najbardziej „optymalne” zapytanie. Tak więc optymalizator twierdzi, że w rzeczywistości plan wykorzystujący tylko jeden wybrany indeks jest tym, który zostanie zrealizowany w najbardziej responsywny sposób.
Więc chociaż brano pod uwagę „przecięcie”, nie było ono „najlepiej dopasowane” i wybrano pojedynczy indeks.