sql >> Database >  >> NoSQL >> MongoDB

Waarom tonen verschillende queryplannen van MongoDB verschillende nReturned-waarde?

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.




  1. applicatie time-out bij verbinding met MongoLab vanuit Heroku

  2. Redis-server kan niet meer dan 1024M maxheap uitvoeren

  3. Welke van CouchDB of MongoDB past bij mijn behoeften?

  4. Node.js multi-server cluster:hoe een object te delen in meerdere nodes cluster