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

Sortieren nach mehreren Feldern Mongo DB

Der MongoDB-Abfrageoptimierer funktioniert, indem er verschiedene Pläne ausprobiert, um festzustellen, welcher Ansatz für eine bestimmte Abfrage am besten geeignet ist. Der Gewinnerplan für dieses Abfragemuster wird dann für die nächsten ~1.000 Abfragen zwischengespeichert oder bis Sie explain() ausführen .

Um zu verstehen, welche Abfragepläne berücksichtigt wurden, sollten Sie explain(1) verwenden , zB:

db.col.find({category:'A'}).sort({updated: -1}).explain(1)

Die allPlans Detail zeigt alle Pläne, die verglichen wurden.

Wenn Sie eine Abfrage ausführen, die nicht sehr selektiv ist (z. B. wenn viele Datensätze Ihren Kriterien von {category: { $ne:'A'}} entsprechen ), kann es für MongoDB schneller sein, Ergebnisse mit einem BasicCursor (Tabellenscan) zu finden, anstatt mit einem Index abzugleichen.

Die Reihenfolge der Felder in der Abfrage macht für die Indexauswahl im Allgemeinen keinen Unterschied (es gibt ein paar Ausnahmen bei Bereichsabfragen). Die Reihenfolge der Felder in einer Sortierung wirkt sich auf die Indexauswahl aus. Wenn Ihr sort() Kriterien nicht mit der Indexreihenfolge übereinstimmen, müssen die Ergebnisdaten neu sortiert werden, nachdem der Index verwendet wurde (Sie sollten scanAndOrder:true sehen in der EXPLAIN-Ausgabe, wenn dies passiert).

Es ist auch erwähnenswert, dass MongoDB nur einen Index pro Abfrage verwendet (mit Ausnahme von $or s).

Wenn Sie also versuchen, die Abfrage zu optimieren:

db.col.find({category:'A'}).sort({updated: -1, rating: -1})

Sie sollten alle drei Felder in den Index aufnehmen:

db.col.ensureIndex({category: 1, updated: -1, rating: -1})

Zu Ihrer Information, wenn Sie eine bestimmte Abfrage dazu zwingen möchten, einen Index zu verwenden (im Allgemeinen nicht erforderlich oder empfohlen), gibt es einen hint() Option, die Sie ausprobieren können.