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

Índice de rango de fechas de Mongo con filtros

Algunos puntos clave del resultado del plan de explicación:

  • La consulta aborda los siguientes atributos:siteId, status, creationDate, reportCount, assignee, parent
  • El plan ganador tiene dos etapas:
    • IX_SCAN usa creationDate_1_reportCount_1_label_1 , esto usa búsquedas indexadas en creationDate y reportCount para identificar 56 documentos que luego se envían a la etapa FETCH
    • FETCH recibe 56 documentos de la etapa IX_SCAN y luego interroga estos documentos para aplicar el siteId , status , assignee y parent filtros Este interrogatorio hace que se descarten 37 documentos, lo que da como resultado que se devuelvan 19 documentos.

Por lo tanto, su índice cubre solo 2 de los 6 atributos de su consulta y los 4 atributos restantes de su consulta se aplican al examinar los documentos. no el índice . Si desea que esta consulta esté completamente cubierta por el índice, cree el siguiente índice:

db.collection.createIndex(
    {siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
) 

Si vuelve a ejecutar con este índice en su lugar, debería encontrar que (a) MongoDB elige este índice y (b) la cantidad de documentos enviados por la etapa IX_SCAN es la misma que la cantidad de documentos devueltos por su llamada de búsqueda.

Digo "debería encontrar" porque hay otros aspectos aquí que podrían hacer que MongoDB elija un índice diferente, p. uso de $nor y la etapa de clasificación (creationDate: 1 ). Recomendaría ajustar el índice y ejecutar la explicación 'activada' después de cada ajuste y buscar estos elementos clave en executionStats subdocumento:

  • "nDevuelto"
  • "totalKeysExamined"
  • "totalDocsExamined"

Una regla general simple es esta:cuanto más cerca esté totalKeysExamined es para nReturned y cuanto más cercano totalDocsExamined es cero... mejor será la cobertura de su índice.

También está la cuestión del costo de un índice (en términos del impacto en los tiempos de escritura y el almacenamiento del índice), por lo que sugiero considerar sus requisitos no funcionales:¿se pueden lograr los tiempos transcurridos deseados sin una cobertura completa del índice? De lo contrario, debe continuar con las pruebas empíricas, pero prepárese para modificar su elección en respuesta a lo que explain() la salida te lo dice.