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

La canalización agregada de MongoDB es lenta después del primer paso de coincidencia

RESPUESTA 2019

Esta respuesta es para MongoDB 4.2

Después de leer la pregunta y la discusión entre ustedes, creo que el problema está resuelto, pero la optimización sigue siendo un problema común para todos los que usan MongoDB.

Enfrenté el mismo problema, y ​​aquí están los consejos para la optimización de consultas.

Corrígeme si me equivoco :)

1. Agregar índice en la colección

Los índices juegan un papel vital en la ejecución de consultas rápidamente, ya que los índices son estructuras de datos que pueden almacenar el conjunto de datos de la colección en un formato que es fácil de recorrer. Las consultas se ejecutan de manera eficiente con la ayuda de índices en MongoDB.

Puede crear un tipo diferente de índices según sus necesidades. Obtenga más información sobre los índices aquí, la documentación oficial de MongoDB.

2. Optimización de canalización

  • Siempre utilice $match antes de $project , ya que los filtros eliminan documentos y campos adicionales de la siguiente etapa.
  • Recuerde siempre que los índices los usan $match y $sort . Por lo tanto, intente agregar un índice a los campos en los que va a ordenar o filtrar documentos.
  • Intente mantener esta secuencia en su consulta, utilice $sort antes de $limit como $clasificar + $límite + $saltar. Porque $sort aprovecha el índice y permite que MongoDB seleccione el plan de consulta requerido mientras ejecuta la consulta.
  • Siempre use $límite antes de $saltar por lo que se aplicará la omisión para limitar los Documentos.
  • Usar $proyecto para devolver solo los datos necesarios en la siguiente etapa.
  • Siempre cree un índice en los atributos de campo extranjero en una $búsqueda . Además, como la búsqueda produce una matriz, generalmente la desenredamos en la siguiente etapa. Entonces, en lugar de desenrollarlo en la siguiente etapa, desenróllelo dentro de la búsqueda como:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Usar allowDiskUse en agregación, con la ayuda de las operaciones de agregación, puede escribir datos en el subdirectorio _tmp en el directorio Ruta de la base de datos. Se utiliza para realizar la consulta grande en el directorio temporal. Por ejemplo:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Reconstruir los índices

Si está creando y eliminando índices con bastante frecuencia, reconstruya sus índices. Ayuda a MongoDB a actualizar, el plan de consulta previamente almacenado en el caché, que sigue asumiendo el plan de consulta requerido, créanme, ese problema apesta :(

4. Eliminar índices no deseados

Demasiados índices toman demasiado tiempo en la operación Crear, Actualizar y Eliminar, ya que necesitan crear índices junto con sus tareas. Entonces, eliminarlos ayuda mucho.

5. Limitación de documentos

En un escenario del mundo real, obtener datos completos presentes en la base de datos no ayuda. Además, no puede mostrarlo o el usuario no puede leer los datos obtenidos completos. Entonces, en lugar de obtener datos completos, obtenga datos en fragmentos que lo ayuden tanto a usted como a su cliente a ver esos datos.

Y, por último, ver qué plan de ejecución selecciona MongoDB ayuda a descubrir el problema principal. Por lo tanto, $explain lo ayudará a resolverlo.

Espero que este resumen los ayude, siéntanse libres de sugerir nuevos puntos si me perdí alguno. Los agregaré también.