MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Warum zeigen verschiedene MongoDB-Abfragepläne unterschiedliche nReturned-Werte?

Dies wurde im allPlansExecution Mode Dokumentationsseite. Paraphrasieren:

Wenn während der Planauswahl mehr als ein Index vorhanden ist, der eine Abfrage erfüllen kann, führt MongoDB einen Versuch mit allen gültigen Plänen durch, um festzustellen, welcher am besten abschneidet. Siehe Abfragepläne Einzelheiten zu diesem Vorgang.

Ab MongoDB 3.4.6 umfasst die Planauswahl das parallele Ausführen von Kandidatenplänen in einem „Wettlauf“ und zu sehen, welcher Kandidatenplan zuerst 101 Ergebnisse zurückgibt. In Ihrem obigen Beispiel schaffte der Gewinnerplan zu dem Zeitpunkt, als der Siegerplan 101 Ergebnisse im Rennen lieferte, nur 2 Ergebnisse. Der Gewinnerplan wird dann bis zum Ende ausgeführt. Aus diesem Grund zeigt der Verliererplan nur nReturned: 2 an in den Statistiken.

Dieses „Wettrennen“ wird durchgeführt, da MongoDB bei zwei identisch aussehenden Plänen aufgrund der Flexibilität von JSON-Dokumenten nicht weiß, welcher Plan der beste für eine bestimmte Abfrage ist (anders als z. B. SQL, wo die Struktur der Tabellen bekannt ist). . Natürlich ist es durchaus möglich, dass MongoDB falsch rät und am Ende einen weniger leistungsfähigen Plan hat, da es sich um einen empirischen Prozess handelt. Aus diesem Grund ist es am besten, Indizes zu erstellen, die Ihre Abfragen unterstützen, damit MongoDB nicht raten muss. Andernfalls können Sie hint() verwenden um MongoDB mitzuteilen, welcher Index für eine bestimmte Abfrage verwendet werden soll.

Daher:

  • Die Statistik für den Gewinnerplan ist die eigentliche Ergebnisstatistik der Abfrage.
  • Die Statistik für die verlierenden Pläne zeigt nur die Statistik für den Testlauf der Abfrageplanung.
  • Die Planauswahl beinhaltet ein "Rennen" um 101 Ergebnisse. Dieses Rennen wird nur durchgeführt, wenn es mehrere Indizes gibt, die die Abfrage erfüllen können.

Anmerkung 1 :Keiner der beiden Pläne, die Sie gesehen haben, war großartig. Der Gewinnplan zeigt "nReturned" : 43 , "totalKeysExamined" : 221 , und "totalDocsExamined" : 219 . Das bedeutet, dass MongoDB nur 219 Dokumente untersuchen muss, um 43 davon zurückzugeben:nur 20 % Effizienz . Idealerweise möchten Sie den nReturned haben Zahlen gleich totalDocsExamined .

Anmerkung 2 :Versuchen Sie, den zusammengesetzten Index {'rack_name': 1, 'timestamp': 1} zu erstellen . Mit derselben Abfrage sollten Sie eine bessere Effizienzzahl erhalten.

Anmerkung 3 :Beachten Sie, dass seit allPlansExecution angegeben wurde, alle Die Statistik wird von MongoDB aus Gründen der Vollständigkeit ordnungsgemäß an Sie zurückgegeben, während sie keinerlei Einfluss auf das endgültige nReturned hat Ergebnis. Es war ein abgelehnter Plan und der nReturned: 2 Nummer kann verwirrend sein. Sie werden diese Statistik nicht sehen, wenn Sie executionStats verwenden Einstellung. In erster Linie die allPlansExecution wird zur Feinabstimmung und Bestimmung verwendet, warum einige Pläne abgelehnt werden.