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

Wie kann man die MongoDB-Abfrage sowohl mit $gt als auch mit $lte optimieren?

Daher sind Doppelbereichsabfragen in Mongo nicht ratsam. Ich nehme an, Sie haben einen einzelnen Index, der sowohl {start_ip_num: 1, end_ip_num: 1} enthält .

Wenn Sie damit nicht nah genug herankommen (oft ist es immer noch langsam, wenn Sie genügend Daten vom ersten Feld zurückgeben, da es viel B-Tree-Scanning durchführen muss), gibt es einen Trick, den Sie anwenden können, um dies zu bekämpfen Verwenden von 2D-Box-Abfragen (funktioniert nur für zwei Bereiche gleichzeitig).

Im Grunde setzen Sie einen 2D-Geoindex auf ein Feld, das die beiden Punkte in einem Array enthält, z. B. [start_ip, end_ip], und geben ihm einen ausreichend hohen Min/Max-Wert, damit er nicht die standardmäßig festgelegten Grenzen erreicht -180/180.

Verwenden Sie schließlich eine Begrenzungsabfrage mit dem Bereich von min bis zum $lte-Wert an einer Ecke des Felds und dem gt- und dem max-Wert an der anderen Ecke des Felds. Siehe http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries für die Syntax.

Es sieht in etwa so aus:

db.ip_ranges.find({ip_range:{$within:{$box:[[0, 1204135028], [1204135028, max]]}}});

wobei max die größte IP ist, die Sie haben können.

Es ist schon eine Weile her, dass ich mir das angesehen habe, also könnte die Box falsch sein, aber das Konzept ist solide, und es hat dazu geführt, dass die Double-Range-Abfragen etwas besser abschneiden als mit einem normalen B-Tree-Index mit zwei Feldern. Konsequent unter einer Sekunde (obwohl normalerweise ein paar hundert ms), verglichen mit ein paar Sekunden mit dem regulären Index – ich glaube, ich hatte damals Hunderte von Millionen von Dokumenten, aber es ist eine Weile her, also nehmen Sie diese erinnerten Benchmarks mit einem Körnchen aus Salz. Ich bin mir sicher, dass die Ergebnisse abhängig von Ihren Daten und Bereichsgrößen stark variieren werden.

Aktualisierung: Vielleicht möchten Sie mit den bits experimentieren Probieren Sie eine niedrige und eine hohe Zahl aus, um zu sehen, ob es einen Unterschied macht. Für mich schien es die Abfragen im Durchschnitt nicht zu beeinflussen. Siehe http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-CreatingtheIndex für die Syntax.