Dette blev forklaret i allPlansExecution Mode dokumentationsside. For at omskrive:
Under planvalg, hvis der er mere end ét indeks, der kan tilfredsstille en forespørgsel, vil MongoDB køre en prøveversion ved at bruge alle de gyldige planer for at bestemme, hvilken der klarede sig bedst. Se Forespørgselsplaner for detaljer vedrørende denne proces.
Fra og med MongoDB 3.4.6 involverer planvalget at køre kandidatplaner parallelt i et "løb", og se, hvilken kandidatplan der først returnerer 101 resultater. I dit eksempel ovenfor, da den vindende plan returnerede 101 resultater i løbet, klarede den tabende plan kun 2 resultater. Vinderplanen bliver derefter eksekveret til afslutning. Dette er grunden til, at den tabende plan kun viser nReturned: 2
i statistikken.
Dette "løb" udføres, da hvis der er to identiske planer, ved MongoDB ikke, hvilken plan der er den bedste til en bestemt forespørgsel på grund af fleksibiliteten i JSON-dokumenter (i modsætning til f.eks. SQL, hvor strukturen af tabellerne er kendt) . Det er selvfølgelig fuldt ud muligt, at MongoDB gætter forkert og ender med en plan, der ikke er så god, da det er en empirisk proces. Af denne grund er det bedst at oprette indekser, der understøtter dine forespørgsler, så MongoDB ikke behøver at gætte. Ellers kan du bruge hint()
at fortælle MongoDB hvilket indeks der skal bruges til en bestemt forespørgsel.
Derfor:
- Statistikken for den vindende plan er den faktiske forespørgsels resultatstatistik.
- Statistikken for den eller de tabende planer viser kun statistikken for prøvekørslen for forespørgselsplanlægning.
- Planvalget involverer at køre et "løb" til 101 resultater. Dette løb udføres kun, når der er flere indekser, der kan tilfredsstille forespørgslen.
Bemærkning 1 :Ingen af de to planer, du så, var gode. Den vindende plan viser "nReturned" : 43
, "totalKeysExamined" : 221
, og "totalDocsExamined" : 219
. Det betyder, at MongoDB kun skal undersøge 219 dokumenter for at returnere 43 af dem:kun 20 % effektivitet . Ideelt set ønsker du at have nReturned
tal lig med totalDocsExamined
.
Bemærkning 2 :Prøv at oprette det sammensatte indeks {'rack_name': 1, 'timestamp': 1}
. Med den samme forespørgsel bør du få et bedre effektivitetstal.
Bemærkning 3 :Bemærk, at siden allPlansExecution
blev angivet, alle statistikker returneres behørigt til dig af MongoDB for grundighed, mens den ikke har nogen som helst betydning for den endelige nReturned
resultat. Det var en afvist plan, og nReturned: 2
nummer kan være forvirrende. Du vil ikke se denne statistik, hvis du bruger executionStats
indstilling. Primært allPlansExecution
bruges til at finjustere og bestemme, hvorfor nogle planer afvises.