Optimizar el rendimiento de las consultas

Para solucionar problemas de consultas lentas, usa Explicación de la consulta para obtener el plan de ejecución de la consulta 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 en función del perfil de ejecución:

Limitar el número de resultados

Usa el campo "Registros devueltos" del árbol de ejecución para identificar si la consulta devuelve muchos documentos. Puedes limitar el número de documentos devueltos mediante la cláusula $limit. De esta forma, se reduce el tamaño en bytes serializado de los resultados cuando se devuelven a los clientes a través de la red. En los casos en los que el nodo Limit va precedido de un nodo MajorSort, el motor de consultas puede combinar los nodos Limit y MajorSort, y sustituir una materialización y una ordenación completas en la memoria por una ordenación TopN, lo que reduce el requisito de memoria de la consulta.

Limitar el tamaño del documento de resultados

Puedes limitar el tamaño del documento devuelto usando la cláusula $project para evitar obtener campos innecesarios. Esto ayuda a reducir el coste de computación y memoria del procesamiento de resultados intermedios, así como 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 los 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é totalmente cubierta por el análisis del índice, lo que evita la necesidad de obtener documentos del almacenamiento principal.

Usar índices

Sigue estas instrucciones para configurar y optimizar los índices.

Identificar si la consulta usa un índice

Para saber si la consulta usa un índice, comprueba los nodos hoja del árbol de ejecución. Si el nodo hoja del árbol de ejecución es un nodo TableScan, significa que la consulta no está usando un índice y está analizando documentos del almacenamiento principal. Si se está usando un índice, el nodo hoja del árbol de ejecución mostrará el ID y los campos del índice.

Identificar si se puede optimizar el índice utilizado

Un índice es útil para una consulta si puede reducir el número de documentos que el motor de consultas necesita obtener del almacenamiento principal o si el orden de sus campos puede cumplir el requisito de ordenación de la consulta.

Si se usa un índice en una consulta, pero el motor de consultas sigue obteniendo y descartando muchos documentos (como se identifica mediante un nodo de análisis que devuelve muchos registros seguido de un nodo de filtro que devuelve pocos registros), significa que el predicado de consulta que se ha usado con el índice no es selectivo. Para crear un índice más adecuado, consulta Creación de índices.

Si se usa un índice que no es de varias claves en una consulta, pero el motor de consultas sigue reordenando en memoria el conjunto de resultados, tal como se identifica mediante un nodo MajorSort en el árbol de ejecución de la consulta, esto indica que el índice usado no se puede utilizar para cumplir el requisito de ordenación de la consulta. Para crear un índice más adecuado, consulta la siguiente sección.

Índice de $lookup

Para mejorar el rendimiento de una fase $lookup, crea un índice en el foreignField de la colección from. De esta forma, la operación de unión puede encontrar de forma eficiente los documentos coincidentes en la colección from sin tener que analizar toda la colección.

Crear índices

Sigue la documentación sobre gestión de índices para crear índices. Para asegurarte de que tu consulta puede usar índices, crea índices normales (no de varias claves) con campos en el siguiente orden:

  1. Todos los campos que se usarán en operadores de igualdad. Para maximizar las probabilidades de reutilización entre consultas, ordena los campos de forma descendente según la frecuencia con la que aparecen en los operadores de igualdad de las consultas.
  2. Todos los campos por los que se ordenarán los datos (en el mismo orden).
  3. Campos que se usarán en operadores de intervalo o de desigualdad en orden decreciente de selectividad de la restricción de la consulta.
  4. Campos que se devolverán como parte de una consulta en el índice: si se incluyen estos campos en el índice, este podrá cubrir la consulta y no tendrá que obtener el documento del almacenamiento principal.

En el caso de las consultas que implican filtrar y ordenar campos de array, considera la posibilidad de crear índices de varias claves.

Usar sugerencia de consulta

Si has creado un índice más adecuado para la consulta, pero el motor de consultas no lo está usando, puedes anular la preferencia de índice del motor de consultas mediante una sugerencia de consulta.