Dit werd uitgelegd in de allPlansExecution-modus documentatie pagina. Om te parafraseren:
Als er tijdens de planselectie meer dan één index is die aan een zoekopdracht kan voldoen, voert MongoDB een proef uit met alle geldige plannen om te bepalen welke de beste presteerde. Zie Queryplannen voor details over dit proces.
Vanaf MongoDB 3.4.6 omvat de planselectie het parallel lopen van kandidaatplannen in een "race", en kijken welk kandidaatplan als eerste 101 resultaten oplevert. In uw voorbeeld hierboven, had het winnende plan tegen de tijd dat het winnende plan 101 resultaten opleverde in de race, slechts 2 resultaten behaald. Het winnende plan wordt vervolgens tot voltooiing uitgevoerd. Dit is de reden waarom het verliezende plan alleen nReturned: 2
. toont in de statistieken.
Deze "race" wordt uitgevoerd omdat als er twee identiek ogende plannen zijn, MongoDB niet weet welk plan het beste is voor een bepaalde query vanwege de flexibiliteit van JSON-documenten (in tegenstelling tot bijvoorbeeld SQL waar de structuur van de tabellen bekend is) . Het is natuurlijk heel goed mogelijk dat MongoDB verkeerd gokt en eindigt met een minder dan performant plan, omdat het een empirisch proces is. Om deze reden is het het beste om indexen te maken die uw zoekopdrachten ondersteunen, zodat MongoDB niet hoeft te raden. Anders kunt u hint()
. gebruiken om MongoDB te vertellen welke index moet worden gebruikt voor een bepaalde zoekopdracht.
Vandaar:
- De statistieken voor het winnende plan zijn de resultaatstatistieken van de daadwerkelijke zoekopdracht.
- De statistieken voor de verliezende abonnement(en) tonen alleen de statistieken voor de proefuitvoering van de queryplanning.
- De planselectie houdt in dat er een "race" naar 101 resultaten wordt gereden. Deze race wordt alleen uitgevoerd als er meerdere indexen zijn die aan de vraag kunnen voldoen.
Opmerking 1 :Geen van de twee plannen die je zag waren geweldig. Het winnende plan toont "nReturned" : 43
, "totalKeysExamined" : 221
, en "totalDocsExamined" : 219
. Dit betekent dat MongoDB 219 documenten hoeft te onderzoeken om er 43 terug te sturen:slechts 20% efficiëntie . Idealiter wilt u de nReturned
getallen gelijk aan totalDocsExamined
.
Opmerking 2 :Probeer de samengestelde index {'rack_name': 1, 'timestamp': 1}
te maken . Met dezelfde vraag zou u een beter efficiëntienummer moeten krijgen.
Opmerking 3 :Merk op dat sinds allPlansExecution
is opgegeven, alle statistieken worden naar behoren teruggestuurd door MongoDB voor grondigheid, terwijl het geen enkele invloed heeft op de uiteindelijke nReturned
resultaat. Het was een afgewezen plan en de nReturned: 2
nummer kan verwarrend zijn. U ziet deze statistieken niet als u executionStats
gebruikt instelling. In de eerste plaats de allPlansExecution
wordt gebruikt om te verfijnen en te bepalen waarom sommige plannen worden afgewezen.