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

Mongo Datumsbereichsindex mit Filtern

Einige wichtige Punkte aus der Ausgabe des Plans erklären:

  • Die Abfrage adressiert die folgenden Attribute:siteId, status, creationDate, reportCount, assignee, parent
  • Der Gewinnplan hat zwei Phasen:
    • IX_SCAN verwendet creationDate_1_reportCount_1_label_1 , verwendet dies indizierte Suchen am creationDate und reportCount um 56 Dokumente zu identifizieren, die dann an die FETCH-Stufe weitergeleitet werden
    • FETCH empfängt 56 Dokumente von der Stufe IX_SCAN und fragt dann diese Dokumente ab, um die siteId anzuwenden , status , assignee und parent Filter. Diese Abfrage führt dazu, dass 37 Dokumente verworfen werden, was dazu führt, dass 19 Dokumente zurückgegeben werden.

Ihr Index deckt also nur 2 der 6 Attribute in Ihrer Abfrage ab und die verbleibenden 4 Attribute in Ihrer Abfrage werden angewendet, indem die Dokumente untersucht werden nicht der Index . Wenn Sie möchten, dass diese Abfrage vollständig indexiert wird, erstellen Sie den folgenden Index:

db.collection.createIndex(
    {siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
) 

Wenn Sie mit diesem Index erneut ausgeführt werden, sollten Sie feststellen, dass (a) MongoDB diesen Index auswählt und (b) die Anzahl der von der IX_SCAN-Stufe weitergeleiteten Dokumente mit der Anzahl der von Ihrem Suchaufruf zurückgegebenen Dokumente übereinstimmt.

Ich sage "finden sollte" weil es hier andere Aspekte gibt, die dazu führen können, dass MongoDB einen anderen Index wählt, z. Verwendung von $nor und die Sortierstufe (creationDate: 1 ). Ich würde empfehlen, den Index zu optimieren und nach jeder Optimierung mit „erläutern“ auszuführen und nach diesen Schlüsselelementen in den executionStats zu suchen Unterdokument:

  • "nReturned"
  • "totalKeysExamined"
  • "totalDocsExamined"

Eine einfache Faustregel lautet:Je näher totalKeysExamined ist zu nReturned und je näher totalDocsExamined auf Null ist ... desto besser ist Ihre Indexabdeckung.

Es stellt sich auch die Frage nach den Kosten eines Indexes (im Hinblick auf die Auswirkungen auf Schreibzeiten und Indexspeicherung), daher würde ich vorschlagen, Ihre nicht funktionalen Anforderungen zu berücksichtigen - können Ihre gewünschten verstrichenen Zeiten ohne vollständige Indexabdeckung erreicht werden? Wenn nicht, dann sollten Sie mit empirischen Tests fortfahren, aber darauf vorbereitet sein, Ihre Wahl entsprechend dem explain() zu optimieren Ausgabe sagt es Ihnen.