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 amcreationDate
undreportCount
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
undparent
Filter. Diese Abfrage führt dazu, dass 37 Dokumente verworfen werden, was dazu führt, dass 19 Dokumente zurückgegeben werden.
- IX_SCAN verwendet
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.