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

Mongodb-Indexstrategie für Bereichsabfragen mit verschiedenen Feldern

Fügen Sie baloo noch ein bisschen mehr hinzu 's Antwort.

Zum Thema Zeitstempel vs. Long. Im Allgemeinen wird der MongoDB-Server keinen Unterschied feststellen. Die BSON-Codierungslänge ist dieselbe (64 Bit). Abhängig von der Codierung des Treibers sehen Sie möglicherweise eine andere Leistung auf der Clientseite. Beispielsweise wird auf der Java-Seite bei Verwendung des 10gen-Treibers ein Zeitstempel als Date gerendert das ist viel schwerer als Long . Es gibt Treiber die versuchen, diesen Overhead zu vermeiden.

Das andere Problem ist, dass Sie eine Leistungsverbesserung sehen, wenn Sie den Bereich für das erste Feld des Index schließen. Wenn Sie also den von baloo vorgeschlagenen Index verwenden :

db.collection.ensureIndex({start: 1, final: 1})

Ihre Abfrage wird (möglicherweise viel) besser abschneiden, wenn Ihre Abfrage lautet:

db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
                    final:{$lt:DateTime(...)}})

Wenn Sie sich die Indizes als Baum vorstellen, begrenzt der geschlossene Bereich konzeptionell beide Seiten des Baums und nicht nur eine Seite. Ohne den geschlossenen Bereich muss der Server alle Einträge mit einem start „überprüfen“. größer als der bereitgestellte Zeitstempel, da die Beziehung zwischen start nicht bekannt ist und final .

Sie werden vielleicht sogar feststellen, dass die Abfrageleistung nicht besser ist, wenn Sie einen Einzelfeldindex verwenden, wie:

db.collection.ensureIndex({start: 1})

Die meisten Einsparungen stammen aus dem Beschneiden des ersten Feldes. Der Fall, in dem dies nicht der Fall ist, ist, wenn die Abfrage durch den Index abgedeckt ist oder die Reihenfolge/Sortierung der Ergebnisse aus dem Index abgeleitet werden kann.

HTH - Rob.