Optimiza el rendimiento de las consultas
Para solucionar problemas de consultas lentas, usa Explicación de consulta para obtener el plan de ejecución de consultas y el perfil de ejecución del tiempo de ejecución. En la siguiente sección, se describen los pasos que puedes seguir para optimizar el rendimiento de las consultas según el perfil de ejecución:
Limita la cantidad de resultados
Usa el campo records returned en el árbol de ejecución para identificar si la consulta devuelve muchos documentos. Considera limitar la cantidad de documentos que se devuelven con la cláusula $limit. Esto reduce el tamaño de los bytes serializados de los resultados cuando se devuelven a los clientes a través de la red. En los casos en que el nodo Limit está precedido por un nodo MajorSort, el motor de consultas puede fusionar los nodos Limit y MajorSort, y reemplazar una materialización y una ordenación completas en la memoria por una ordenación TopN, lo que reduce el requisito de memoria para la consulta.
Limita el tamaño del documento de resultado
Considera limitar el tamaño del documento que se devuelve con la cláusula $project para evitar recuperar campos innecesarios. Esto ayuda a reducir el costo de procesamiento y memoria de los resultados intermedios, y el tamaño de bytes serializados de los resultados cuando se devuelven a los clientes a través de la red. En los casos en que todos los campos a los que se hace referencia en la consulta están cubiertos por un índice normal (no de varias claves), esto también permite que la consulta esté completamente cubierta por el análisis del índice, lo que evita la necesidad de recuperar documentos del almacenamiento principal.
Usa índices
Sigue estas instrucciones para configurar y optimizar los índices.
Identifica si la consulta usa un índice
Para identificar si la consulta usa un índice, verifica los nodos hoja en el árbol de ejecución. Si el nodo hoja de ejecución es un nodo TableScan, significa que la consulta no usa un índice y está analizando documentos del almacenamiento principal. Si se usa un índice, el nodo hoja de ejecución mostrará el ID y los campos del índice.
Identifica si se puede optimizar el índice utilizado
Un índice es útil para una búsqueda si puede reducir la cantidad de documentos que el motor de búsqueda necesita recuperar del almacenamiento principal o si el orden de sus campos puede satisfacer el requisito de ordenamiento de la búsqueda.
Si se usa un índice para una consulta, pero el motor de consultas sigue recuperando y descartando muchos documentos, como lo identifica un nodo de análisis que devuelve muchos registros seguido de un nodo de filtro que devuelve pocos registros, esto es un signo de que el predicado de la consulta que se cumple con el índice no es selectivo. Para crear un índice más adecuado, consulta Crea índices.
Si se usa un índice que no es de varias claves para una consulta, pero el motor de consultas sigue realizando una reordenación en la memoria del conjunto de resultados, como se identifica con un nodo MajorSort en el árbol de ejecución de la consulta, esto indica que el índice utilizado no se puede usar para cumplir con el requisito de ordenamiento de la consulta. Para crear un índice más adecuado, consulta la siguiente sección.
Optimiza las consultas $lookup
Para optimizar las consultas $lookup, agrega índices a la colección from, lo que permite que la operación encuentre de manera eficiente los documentos coincidentes sin analizar toda la colección.
$lookup con localField y foreignField
Si usas las opciones localField y foreignField en la etapa $lookup, crea un índice en foreignField en la colección from.
$lookup con canalizaciones anidadas
Si usas la opción pipeline en la etapa $lookup con etapas $match, crea un índice en los campos involucrados en la colección externa para evitar un análisis completo de la colección:
- Para las etapas
$matchcon semántica de filtro (por ejemplo{$match: {a: true}}), crea un índice en los campos involucrados en la colección externa (a). - Para las etapas
$matchcon semántica de agregación que compara un campo con un valor constante (por ejemplo,{$match: {$expr: {$gt: [a, 10]}}}) o con comparaciones de igualdad (eqoin) entre campos y variables definidas enlet(por ejemplo,{$match: {$expr: {$eq: [a, "$$a"]}}}), crea un índice en los campos involucrados en la colección externa. Ten en cuenta que el índice de varias claves no se usará en la planificación.
Crea índices
Sigue la documentación de administración de índices para crear índices. Para asegurarte de que tu consulta pueda usar índices, crea índices regulares (no de varias claves) con campos en el siguiente orden:
- Son todos los campos que se usarán en los operadores de igualdad. Para maximizar la probabilidad de reutilización en las consultas, ordena los campos en orden descendente de la frecuencia con la que aparecen en los operadores de igualdad entre las consultas.
- Todos los campos por los que se ordenará (en el mismo orden).
- Campos que se usarán en operadores de rango o desigualdad en orden descendente de selectividad de la restricción de consulta.
- Campos que se devolverán como parte de una consulta en el índice: Incluir estos campos en el índice permite que este cubra la consulta y evita tener que recuperar el documento del almacenamiento principal.
Para las consultas que implican filtrar y ordenar campos de array, considera crear índices de varias claves.
Sugerencia de uso de la consulta
Si creaste un índice más adecuado para la consulta, pero el motor de consultas no lo usa, puedes anular la preferencia de índice del motor de consultas con una sugerencia de consulta.