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

cómo estructurar un índice compuesto en mongodb

Esas son muchas preguntas en una sola publicación;) Déjame repasarlas en un orden práctico:

  • Cada consulta puede usar como máximo un índice (con la excepción de las cláusulas $or de nivel superior y demás). Esto incluye cualquier clasificación.
  • Debido a lo anterior, definitivamente necesitará un índice compuesto para su problema en lugar de índices separados por campo.
  • Los campos de cardinalidad baja (es decir, los campos con muy pocos valores únicos en su conjunto de datos) generalmente no deberían estar en el índice ya que su selectividad es muy limitada.
  • El orden de los campos en su índice compuesto es importante, al igual que la dirección relativa de cada campo en su índice compuesto (por ejemplo, "{name:1, age:-1}"). Hay mucha documentación sobre índices compuestos y direcciones de campo de índice en mongodb.org, así que no la repetiré aquí.
  • Las ordenaciones solo usarán el índice si el campo de ordenación está en el índice y es el campo en el índice directamente después del último campo que se usó para seleccionar el conjunto de resultados. En la mayoría de los casos, este sería el último campo del índice.

Por lo tanto, no debe incluir el estado en su índice en absoluto, ya que una vez que el recorrido del índice haya eliminado la gran mayoría de los documentos basados ​​en campos de cardinalidad más alta, quedarán como máximo 2-3 documentos en la mayoría de los casos, lo que apenas se optimiza con un índice de estado. (especialmente porque mencionó que es muy probable que esos 2-3 documentos tengan el mismo estado de todos modos).

Ahora, la última nota que es relevante en su caso es que cuando usa consultas de rango (y lo está haciendo) no usará el índice para ordenar de todos modos. Puede verificar esto mirando el valor "scanAndOrder" de su explicación () una vez que pruebe su consulta. Si ese valor existe y es verdadero, significa que ordenará el conjunto de resultados en la memoria (escanear y ordenar) en lugar de usar el índice directamente. Esto no se puede evitar en su caso específico.

Por lo tanto, su índice debería ser:

db.posts.ensureIndex({start:1, end:1})

y su consulta (orden modificado solo para mayor claridad, el optimizador de consultas ejecutará su consulta original a través de la misma ruta de ejecución, pero prefiero poner los campos indexados primero y en orden):

db.posts.find({start: {$lt: today}, end: {$gt: today}, status: {$gte:0}}).sort({sortOrder:1})