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

Mongodb Explicar para el marco de Agregación

Comenzando con MongoDB versión 3.0, simplemente cambiando el orden de

collection.aggregate(...).explain()

a

collection.explain().aggregate(...)

le dará los resultados deseados (documentación aquí).

Para versiones anteriores>=2.6, necesitará usar explain opción para operaciones de tubería de agregación

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Una consideración importante con Aggregation Framework es que un índice solo se puede usar para obtener los datos iniciales de una canalización (por ejemplo, el uso de $match , $sort , $geonear al comienzo de una canalización), así como subsiguientes $lookup y $graphLookup etapas Una vez que los datos se han obtenido en la canalización de agregación para su procesamiento (por ejemplo, pasando por etapas como $project , $unwind y $group ) la manipulación adicional será en memoria (posiblemente usando archivos temporales si allowDiskUse la opción está configurada).

Optimización de canalizaciones

En general, puede optimizar las canalizaciones de agregación al:

  • Comenzar una tubería con un $match para restringir el procesamiento a documentos relevantes.
  • Garantizar la $match inicial / $sort las etapas están respaldadas por un índice eficiente.
  • Filtrado temprano de datos usando $match , $limit y $skip .
  • Minimizar las etapas innecesarias y la manipulación de documentos (tal vez reconsiderar su esquema si se requieren gimnasia de agregación complicada).
  • Aprovechar los nuevos operadores de agregación si ha actualizado su servidor MongoDB. Por ejemplo, MongoDB 3.4 agregó muchas nuevas etapas y expresiones de agregación, incluida la compatibilidad para trabajar con matrices, cadenas y facetas.

También hay una serie de optimizaciones de canalización de agregación que ocurren automáticamente según la versión de su servidor MongoDB. Por ejemplo, las etapas adyacentes pueden fusionarse y/o reordenarse para mejorar la ejecución sin afectar los resultados de salida.

Limitaciones

Como en MongoDB 3.4, el marco de agregación explain La opción proporciona información sobre cómo se procesa una canalización, pero no admite el mismo nivel de detalle que executionStats modo para un find() consulta. Si está enfocado en optimizar la ejecución inicial de la consulta, probablemente le resultará beneficioso revisar el equivalente find().explain() consulta con executionStats o allPlansExecution verbosidad.

Hay algunas solicitudes de características relevantes para ver/votar a favor en el rastreador de problemas de MongoDB con respecto a estadísticas de ejecución más detalladas para ayudar a optimizar/perfilar canalizaciones de agregación:

  • SERVER-19758:Agregar modos de explicación "executionStats" y "allPlansExecution" a la explicación de agregación
  • SERVER-21784:seguimiento de las estadísticas de ejecución para cada etapa de canalización de agregación y exposición a través de explicación
  • SERVER-22622:Mejore la explicación de $búsqueda para indicar el plan de consulta en la colección "desde"