Wie, um zu bestimmen, wenn eine vollständige Sammlung-scan wurde durchgeführt in MongoDB
Ich verstehe, dass mit der Ausgabe .explain()
auf einen MongoDB-Abfrage, können Sie uns den Unterschied zwischen n
und nscanned
zu bestimmen, wenn eine vollständige Auflistung scan durchgeführt wurde, oder wenn ein index verwendet wurde. Die docs Zustand
Du willst
n
undnscanned
werden nahe dem Wert wie möglich.
Kyle Banker ' s ausgezeichnetes Buch, MongoDB in Action sagt etwas sehr ähnliches:
Allgemein gesprochen, Sie wollen, dass die Werte von
n
undnscanned
zu sein, so nah wie möglich zusammen. Wenn dabei eine Sammlung Scannen, dies ist fast nie der Fall.
Eindeutig weder diese Aussagen sind definitiv über den Vergleich n
und nscanned
. Welcher Anteil der Differenz in der Regel lässt sich eine komplette Sammlung zu Scannen - 10%, 20%, 30%+? Gibt es irgendwelche anderen Möglichkeiten, um zu überprüfen, ob eine vollständige Sammlung-scan wurde durchgeführt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist unmöglich zu sagen, aber wenn es wirklich drauf ankommt, eine ganze tonne dann könnte man sehen, dass ein Leistungsabfall von bis zu 200% bei einem Durchschnitt finden; ja, Sie WIRD es bemerken. Es ist viel wie jede andere Datenbank an dieser front.
Könnte man anfangen, MongoDB mit einer fahne, die sagt, dass es niemals ein full table scan, in dem Fall ist es eine Ausnahme, wenn es versucht: http://docs.mongodb.org/manual/reference/mongod/#cmdoption-mongod--notablescan
Jedoch die beste Möglichkeit ist, einfach zu verwenden
explain
hier, werden Sie wissen, wenn eine Abfrage keinen index und ist gezwungen, zu Scannen die gesamte Sammlung von entweder Festplatte oder Speicher.a
vondb.col.find({a:1,b:1})
Die Antworten oben sind NICHT ganz korrekt.
Einer Sammlung-scan auch durchgeführt werden, wenn ein index für die Sortierung verwendet, kann aber nicht helfen, die mit den Kriterien übereinstimmen. In einem solchen Fall alle Dokumente sind gescannt (in der index-Reihenfolge) zu finden, die docs, die mit den Suchkriterien. Eine andere Möglichkeit ist, dass es möglicherweise eine teilweise Sammlung Scannen, wo der index ist in der Lage zu verengen die Teilmenge der Dokumente nach einem oder mehreren Kriterien finden, aber immer noch braucht, um zu Scannen dieser Teil der docs to find matches für die vollständigen Kriterien finden.
In diesen Situationen, erklären, zeigen ein index verwendet wird, und nicht BasicCursor. Während also das Vorhandensein von BasicCursor in erklären, ist bezeichnend für eine Sammlung-scan durchgeführt wird, wenn es bedeutet nicht, dass eine Sammlung-scan nicht durchgeführt wurde.
Auch, mit --notablescan auch nicht helfen, wo ein index für die Sortierung verwendet. Da fragt nur einer Ausnahme, wo ein index nicht verwendet. Es sieht nicht, ob der index verwendet wurde, der für das match oder das Sortieren.
Die einzige narrensichere Methode, um zu ermitteln, ob eine Sammlung-scan durchgeführt, ist der Vergleich der index-Schlüssel mit der match-Kriterien in der Abfrage. Wenn der index ausgewählt, die von der Abfrage-Optimierer (siehe erklären) ist nicht in der Lage, die zur Beantwortung der Abfrage mit den Kriterien übereinstimmen (dh verschiedene Felder), dann eine Sammlung-scan ist erforderlich.
Endgültige Antwort ist in der ersten Zeile zu erklären ( - ) Ausgang.
Wenn er sagt, cursor-Typ ist "BasicCursor" dann war es eine einfache Sammlung Scannen.
Sonst wird es sagen, welche Art von index es verwendet, und der name des index, I. e. "BtreeCursor id"
Siehe die Dokumentation hier: http://docs.mongodb.org/manual/reference/explain/#explain-output-fields-core für gleiche Erklärung.
b
tun, und dann:db.col.find({a:1}).sort({b:1});
dann kann ich nicht sehen, wie es zu tun pflegte einen full table scan, aber jaStreng scheint es, dass ein full table scan hat nur getan, wenn der cursor basic cursor.
Wenn es eine btree-cursor, dann evtl. ein full table scan kann immer noch effektiv getan haben, um Datensätze zu finden, mit btree index nur verwendet wurde für die Sortierung. Obwohl, wenn man den output zu erklären, können Sie wirklich sicher sein, dass es ein full table scan, ohne zu gehen und in der Buchführung und im Blick auf die vorhandenen Indizes.
Was, im Zusammenhang mit der Frage hätte klar sein, wenn Sie, dass die Abfrage nicht effizient ist und dass eine bessere übersicht nötig ist, oder sein sollte, angedeutet.
Können Sie prüfen, die erklären, die der Bühne (von MongoDB doc):
Phasen beschreibe den Vorgang; z.B.
-COLLSCAN für eine Sammlung Scannen
-IXSCAN für das Scannen von index-Schlüssel
-ABRUFEN für das abrufen von Dokumenten
-SHARD_MERGE für die Zusammenführung der Ergebnisse aus Scherben