MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment optimiser la requête MongoDB avec $gt et $lte ?

Ainsi, les requêtes à double plage sont déconseillées dans Mongo. Je suppose que vous avez un seul index contenant à la fois {start_ip_num: 1, end_ip_num: 1} .

Si cela ne vous rapproche pas suffisamment (souvent, c'est encore lent si vous avez suffisamment de données renvoyées par le premier champ, car il doit faire beaucoup de balayage B-tree), il y a une astuce que vous pouvez faire pour lutter contre cela en utilisant des requêtes de boîte 2D (ne fonctionne que pour deux plages à la fois).

Fondamentalement, vous mettez un index géographique 2D sur un champ contenant les deux points dans un tableau, comme [start_ip, end_ip], et lui donnez une valeur min/max suffisamment élevée pour qu'il n'atteigne pas les limites qui sont par défaut juste -180/180.

Enfin, utilisez une requête de limites avec la plage allant de min à la valeur $ lte sur un coin de la boîte, et les valeurs gt et max sur l'autre coin de la boîte. Voir http://www.mongodb.org/display/DOCS/ Géospatial+Indexation#GeospatialIndexing-BoundsQueries pour la syntaxe.

Cela ressemble à ceci :

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

où max est la plus grande adresse IP que vous pouvez avoir.

Cela fait un moment que je n'ai pas regardé ceci, donc la boîte peut être fausse, mais le concept est solide, et cela a rendu les requêtes à double plage un peu meilleures qu'avec un index B-tree à deux champs. Constamment sous une seconde (bien que généralement quelques centaines de ms), par rapport à quelques secondes avec l'index normal - je pense que j'avais des centaines de millions de documents à l'époque, mais cela fait un moment, alors prenez ces repères mémorisés avec un grain de sel. Les résultats varieront considérablement en fonction de vos données et de la taille des plages, j'en suis sûr.

Mise à jour : Vous voudrez peut-être expérimenter avec les bits paramètre, en essayant un nombre bas et un nombre élevé pour voir si cela fait une différence. Pour moi, cela ne semblait pas affecter les requêtes en moyenne. Voir http://www.mongodb.org/display/DOCS/ Indexation+géospatiale#Indexation+géospatiale-Créerl'index pour la syntaxe.