sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvorfor viser MongoDB forskellige forespørgselsplaner forskellig nReturneret værdi?

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.




  1. Bringer MongoDB til produktion

  2. Spring Data RedisTemplate:Serialisering af værdien og HashValue

  3. Hvordan fjerner man kun et eller to felter fra dokumenter i mongodb?

  4. mongodb sortering og regex-forespørgsel på en effektiv måde