sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo optimizar la consulta de MongoDB con $ gt y $ lte?

Por lo tanto, las consultas de rango doble no son recomendables en Mongo. Supongo que tiene un solo índice que contiene tanto {start_ip_num: 1, end_ip_num: 1} .

Si eso no lo acerca lo suficiente (a menudo sigue siendo lento si tiene suficientes datos devueltos por el primer campo, ya que tiene que hacer una gran cantidad de escaneo de árbol B), hay un truco que puede hacer para combatir esto usando consultas de cuadro 2D (solo funciona para dos rangos a la vez).

Básicamente, coloca un índice geográfico 2D en un campo que contiene los dos puntos en una matriz, como [start_ip, end_ip], y le asigna un valor mínimo/máximo lo suficientemente alto para que no llegue a los límites que son por defecto solo -180/180.

Finalmente, use una consulta de límites con el rango que va desde min hasta el valor de $lte en una esquina del cuadro, y el valor gt y max en la otra esquina del cuadro. Consulte http://www.mongodb.org/display/DOCS/ Indexación+geoespacial#Consultas de límites de indexación geoespacial para la sintaxis.

Se parece a esto:

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

donde max es la IP más grande que puedes tener.

Ha pasado un tiempo desde que miré esto, por lo que el cuadro puede estar equivocado, pero el concepto es sólido e hizo que las consultas de rango doble funcionaran un poco mejor que con un índice de árbol B normal de dos campos. Consistentemente por debajo de un segundo (aunque generalmente unos pocos cientos de ms), en comparación con unos pocos segundos con el índice normal:creo que tenía cientos de millones de documentos en ese momento, pero ha pasado un tiempo, así que tome estos puntos de referencia recordados con un grano de sal. Los resultados variarán mucho dependiendo de sus datos y tamaños de rango, estoy seguro.

Actualización: Es posible que desee experimentar con los bits ajuste, probando un número bajo y un número alto para ver si hace una diferencia. Para mí, no pareció afectar las consultas en promedio. Consulte http://www.mongodb.org/display/DOCS/ Indexación+geoespacial#Indizacióngeoespacial-Creacióndelíndice para la sintaxis.