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

estrategia de índice mongodb para consulta de rango con diferentes campos

También agregue un poco más a baloo la respuesta de.

Sobre el tema de la marca de tiempo vs. largo. Generalmente, el servidor MongoDB no notará la diferencia. La longitud de la codificación BSON es la misma (64 bits). Es posible que vea un rendimiento diferente en el lado del cliente según la codificación del controlador. Como ejemplo, en el lado de Java, al usar el controlador 10gen, una marca de tiempo se representa como Date eso es mucho más pesado que Long . Hay controladores que tratan de evitar esa sobrecarga.

El otro problema es que verá una mejora en el rendimiento si cierra el rango del primer campo del índice. Entonces, si usa el índice sugerido por baloo :

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

Su consulta funcionará (potencialmente mucho) mejor si la consulta es:

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

Conceptualmente, si piensa en los índices como un árbol, el rango cerrado limita ambos lados del árbol en lugar de solo un lado. Sin el rango cerrado, el servidor tiene que "verificar" todas las entradas con un start mayor que la marca de tiempo proporcionada ya que no conoce la relación entre start y final .

Incluso puede encontrar que el rendimiento de la consulta no es mejor usando un índice de un solo campo como:

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

La mayor parte del ahorro proviene de la poda del primer campo. El caso en que este no será el caso es cuando la consulta está cubierta por el índice o la ordenación/clasificación de los resultados puede derivarse del índice.

HTH - Rob.