2016-07-25 17 views
1

Soweit ich verstanden habe, nscannedObjects Eintrag in der EXPLAIN() -Methode bedeutet die Anzahl der Dokumente, die MongoDB benötigt, um auf dem Datenträger zu finden.Was bedeutet nscannedObjects = 0 eigentlich?

Meine Frage ist: Wenn dieser Wert 0 ist, was bedeutet das eigentlich neben der obigen Erklärung? Enthält MongoDB einen Cache, in dem einige Dokumente gespeichert sind?

+0

Es bedeutet, dass ein Index verwendet wurde. Indizes sind Datenstrukturen, die nur Teile der Dokumente enthalten, die eine schnelle Suche ermöglichen. – mszymborski

+0

Genau das verwirrt mich. Ich stelle mir den MongoDB-Speicher so vor, als wäre es ein Array (oder eine andere ähnliche Datenstruktur), die die Indizes enthält (als Zeiger/Verweis auf das Objekt auf dem Datenträger, auf dem das Dokument tatsächlich gespeichert ist). Aber dies kollidiert mit dem nscannedObjects = 0, weil es bedeutet, dass MongoDB nicht auf die Festplatte gehen musste. Wo liege ich falsch? –

+0

Index ist eine gesamte Datenstruktur, wie ein Baum. Es enthält Links von einigen Attributen zu _id - wenn Ihre Suchkriterien SOLELY auf dem Index basieren - können Sie nur den Index betrachten. und nicht an den Dokumenten selbst - da sie nicht mehr Informationen zur Auswahl von Dokumenten liefern. Es bedeutet nicht, dass Mongo die Dokumente schließlich nicht abholt - nur dass sie nicht für die Auswahlphase abgeholt wurden. – mszymborski

Antwort

0

Mongo ist eine Dokumentdatenbank, was bedeutet, dass sie die Struktur der gespeicherten Dokumente interpretieren kann (im Gegensatz zu Schlüsselwertspeichern).

Ein besonderer Vorteil dieses Ansatzes besteht darin, dass Sie Indizes für die Dokumente in der Datenbank erstellen können.

Index ist eine Datenstruktur (in der Regel eine Variante des B-Baumes), die auf einem Teil ihrer Attribute (zum Beispiel für die schnelle Suche von Dokumenten stützen kann id (! = _id) oder ein anderes Unterscheidungsmerkmal). Diese sind in der Regel

Wenn Sie nach Dokumenten suchen, die auf indexierten Attributen basieren (z. B. id> 50), muss Mongo das Dokument nicht aus dem Speicher/disk/whatever - it holen kann sehen, welche Dokumente den Kriterien nur auf dem Index entsprechen (beachten Sie, dass das Abrufen von etwas von der Festplatte mehrere Größenordnungen langsamer ist als die Speicherabfrage, selbst wenn kein Cache vorhanden ist) o holen Sie das Dokument zur weiteren Verarbeitung (und das ist nicht von der von Ihnen genannten Statistik abgedeckt).

Indizes sind entscheidend, um hohe Leistung zu erzielen, haben aber auch Nachteile (z. B. selten verwendete Index kann verlangsamen Einsätze und nicht wert sein - nach jedem Einfügen muss der Index aktualisiert werden).

+0

Ich sehe.Also ist das nscannedObjects die Anzahl der Dokumente, die MongoDB von der Festplatte abrufen musste, um diejenigen zu finden, die den Filtern der Abfrage entsprachen, aber nicht diejenigen, die tatsächlich von der Festplatte abgerufen wurden, um als Ausgabe zurückgegeben zu werden, oder? –

+0

Yup. Es gibt eine weitere Statistik namens nFetchedDocuments, die Ihnen genau sagt, wie viele am Ende abgerufen wurden. – mszymborski

1

nscannedObjects = 0 bedeutet, dass keine Abfrage oder Filterung zur Erfüllung Ihrer Abfrage durchgeführt wurde. Die Abfrage wurde ausschließlich anhand von Indizes aufgelöst. Wenn Sie beispielsweise nach {_id:10} suchen und keine übereinstimmenden Dokumente vorhanden sind, erhalten Sie nscannedObjects = 0.

Es hat nichts damit zu tun, dass sich die Daten im Speicher befinden, es gibt keine solche Unterscheidung mit dem Abfrageplan.

Beachten Sie, dass nscanned und nscannedObjects jetzt in MongoDB 3.0 und höher als totalKeysExamined und totalDocsExamined bezeichnet werden, was etwas selbsterklärender ist.

Verwandte Themen