Otimize o desempenho das consultas
Para resolver problemas de consultas lentas, use o comando Query Explain para obter o plano de execução da consulta e o perfil de execução do tempo de execução. A secção seguinte descreve os passos que pode seguir para otimizar o desempenho das consultas, consoante o perfil de execução:
Limite o número de resultados
Use o campo de registos devolvidos na árvore de execução para identificar se a consulta está a devolver muitos documentos. Considere limitar o número de documentos devolvidos usando a cláusula $limit
. Isto reduz o tamanho dos bytes serializados dos resultados quando são devolvidos aos clientes através da rede. Nos casos em que o nó Limit
é precedido por um nó MajorSort
, o motor de consulta pode juntar os nós Limit
e MajorSort
e substituir uma materialização e uma ordenação completas na memória por uma ordenação TopN, o que reduz o requisito de memória para a consulta.
Limite o tamanho do documento de resultado
Considere limitar o tamanho do documento devolvido usando a cláusula $project
para evitar obter campos desnecessários. Isto ajuda a reduzir o custo de computação e memória do processamento de resultados intermédios e o tamanho dos bytes serializados dos resultados quando são devolvidos aos clientes através da rede. Nos casos em que todos os campos referenciados na consulta são abrangidos por um índice normal (não de várias chaves), isto também permite que a consulta seja totalmente abrangida pela análise do índice, evitando a necessidade de obter documentos do armazenamento principal.
Use índices
Siga as instruções que se seguem para configurar e otimizar os índices.
Identifique se a consulta está a usar um índice
Pode identificar se a consulta está a usar um índice verificando os nós finais na árvore de execução. Se o nó folha da árvore de execução for um nó TableScan, significa que a consulta não está a usar um índice e está a analisar documentos do armazenamento principal. Se estiver a ser usado um índice, o nó folha da árvore de execução apresenta o ID do índice e os campos do índice.
Identificar se o índice usado pode ser otimizado
Um índice é útil para uma consulta se puder reduzir o número de documentos que o motor de consulta precisa de obter do armazenamento principal ou se a ordenação dos respetivos campos puder cumprir o requisito de ordenação da consulta.
Se for usado um índice para uma consulta, mas o motor de consultas continuar a obter e rejeitar muitos documentos, conforme identificado por um nó de análise que devolve muitos registos seguido de um nó de filtro que devolve poucos registos, isto é um sinal de que o predicado de consulta satisfeito com o índice não é seletivo. Para criar um índice mais adequado, consulte o artigo Crie índices.
Se for usado um índice não de várias chaves para uma consulta, mas o motor de consulta continuar a reordenar na memória o conjunto de resultados, conforme identificado por um nó MajorSort na árvore de execução da consulta, isto é um sinal de que o índice usado não pode ser usado para cumprir o requisito de ordenação da consulta. Para criar um índice mais adequado, consulte a secção seguinte.
Índice de $lookup
Para melhorar o desempenho de uma fase $lookup
, crie um índice no campo foreignField
na coleção from
. Isto permite que a operação de junção encontre eficientemente documentos correspondentes na coleção from
sem analisar toda a coleção.
Crie índices
Siga a documentação de gestão de índices para criar índices. Para garantir que a sua consulta pode usar índices, crie índices normais (não de várias chaves) com campos na seguinte ordem:
- Todos os campos que vão ser usados em operadores de igualdade. Para maximizar a probabilidade de reutilização em várias consultas, ordene os campos por ordem decrescente de ocorrência dos campos nos operadores de igualdade entre consultas.
- Todos os campos pelos quais a ordenação vai ser feita (pela mesma ordem).
- Campos que vão ser usados em operadores de intervalo ou de desigualdade por ordem decrescente de seletividade da restrição de consulta.
- Campos que vão ser devolvidos como parte de uma consulta no índice: a inclusão destes campos no índice permite que o índice cubra a consulta e evita ter de obter o documento do armazenamento principal.
Para consultas que envolvem a filtragem e a ordenação de campos de matriz, considere criar índices de várias chaves.
Usar sugestão de consulta
Se tiver criado um índice mais adequado para a consulta, mas o motor de consultas não estiver a usar esse índice, pode substituir a preferência de índice do motor de consultas usando uma sugestão de consulta.