sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför MongoDB olika frågeplaner visar olika nReturned värde?

Detta förklarades i allPlansExecution Mode dokumentationssida. För att parafrasera:

Under planval, om det finns mer än ett index som kan tillfredsställa en fråga, kommer MongoDB att köra en testversion med alla giltiga planer för att avgöra vilken som presterade bäst. Se Frågeplaner för detaljer om denna process.

Från och med MongoDB 3.4.6 innebär valet av plan att köra kandidatplaner parallellt i ett "lopp", och se vilken kandidatplan som ger 101 resultat först. I ditt exempel ovan, när den vinnande planen gav 101 resultat i loppet, lyckades den förlorande planen endast 2 resultat. Den vinnande planen genomförs sedan till slut. Detta är anledningen till att den förlorande planen endast visar nReturned: 2 i statistiken.

Detta "lopp" utförs eftersom om det finns två identiska planer, vet MongoDB inte vilken plan som är bäst för en viss fråga på grund av flexibiliteten hos JSON-dokument (till skillnad från t.ex. SQL där strukturen på tabellerna är känd) . Naturligtvis är det fullt möjligt att MongoDB gissar fel och slutar med en plan som inte fungerar bra, eftersom det är en empirisk process. Av denna anledning är det bäst att skapa index som stöder dina frågor så att MongoDB inte behöver gissa. Annars kan du använda hint() för att tala om för MongoDB vilket index som ska användas för en viss fråga.

Därför:

  • Statistiken för den vinnande planen är den faktiska frågans resultatstatistik.
  • Statistiken för de förlorande planerna visar bara statistiken för testkörningen av frågeplanering.
  • Planvalet innebär att man kör ett "lopp" till 101 resultat. Detta lopp utförs endast när det finns flera index som kan tillfredsställa frågan.

Anmärkning 1 :Ingen av de två planerna du såg var bra. Den vinnande planen visar "nReturned" : 43 , "totalKeysExamined" : 221 , och "totalDocsExamined" : 219 . Detta innebär att MongoDB behöver granska 219 dokument bara för att returnera 43 av dem:endast 20 % effektivitet . Helst vill du ha nReturned nummer lika med totalDocsExamined .

Anmärkning 2 :Försök att skapa det sammansatta indexet {'rack_name': 1, 'timestamp': 1} . Med samma fråga bör du få ett bättre effektivitetstal.

Anmärkning 3 :Observera att sedan allPlansExecution specificerades, alla statistiken returneras till dig av MongoDB för noggrannhet, medan den inte har någon som helst betydelse för den slutliga nReturned resultat. Det var en avvisad plan och nReturned: 2 nummer kan vara förvirrande. Du kommer inte att se denna statistik om du använder executionStats miljö. I första hand allPlansExecution används för att finjustera och bestämma varför vissa planer avvisas.




  1. Mongoose Connection

  2. Hur man distribuerar MongoDB för hög tillgänglighet

  3. MongoDB Aggregation med officiell C#-drivrutin?

  4. Hur använder man variabler i MongoDB-frågan?