Otimizar o desempenho da consulta
Para resolver problemas de consultas lentas, use o Query Explain para acessar o plano de execução da consulta e o perfil de execução de ambiente de execução. Nesta seção, descrevemos as etapas que podem ser seguidas para otimizar o desempenho da consulta, dependendo do perfil de execução:
Limitar o número de resultados
Use o campo de registros retornados na árvore de execução para identificar se a consulta está retornando muitos documentos. Considere limitar o número de documentos retornados usando a cláusula $limit. Isso reduz o tamanho do byte serializado dos resultados quando retornados aos clientes pela rede. Nos casos em que o nó Limit é precedido por um nó MajorSort, o mecanismo de consulta pode coalescer os nós Limit e MajorSort e substituir uma materialização e classificação completa na memória por uma ordenação TopN, reduzindo o requisito de memória para a consulta.
Limitar o tamanho do documento de resultados
Considere limitar o tamanho do documento retornado usando a cláusula $project para evitar a busca de campos desnecessários. Isso ajuda a reduzir o custo de computação e memória do processamento de resultados intermediários e o tamanho do byte serializado dos resultados quando retornados aos clientes pela rede. Nos casos em que todos os campos referenciados na consulta são cobertos por um índice regular (sem várias chaves), isso também permite que a consulta seja totalmente coberta pela verificação de índice, sem precisar buscar documentos no armazenamento principal.
Usar índices
Use as instruções a seguir para configurar e otimizar índices.
Identificar se a consulta usa um índice
Para saber se a consulta usa um índice, verifique os nós folha na árvore de execução. Se o nó folha da árvore de execução for um nó TableScan, a consulta não estará usando um índice e vai verificar os documentos do armazenamento principal. Se um índice estiver em uso, o nó folha da árvore de execução vai mostrar o ID e os campos do índice.
Identificar se o índice em uso pode ser otimizado
Um índice é útil para uma consulta se puder reduzir o número de documentos que o mecanismo de consulta precisa buscar no armazenamento principal ou se a ordenação de campos puder atender ao requisito de classificação da consulta.
Se um índice for usado em uma consulta, mas o mecanismo de consulta ainda estiver buscando e descartando muitos documentos, conforme identificado por um nó de verificação que retorna muitos registros seguido por um nó de filtro que retorna poucos registros, isso é um sinal de que o predicado de consulta satisfeito que usa o índice não é seletivo. Para criar um índice mais adequado, consulte Criar índices.
Se um índice sem várias chaves for usado em uma consulta, mas o mecanismo de consulta ainda estiver realizando uma reordenação na memória do conjunto de resultados, conforme identificado por um nó MajorSort na árvore de execução da consulta, isso é um sinal de que o índice em uso não pode ser usado para atender ao requisito de classificação da consulta. Para criar um índice mais adequado, consulte a próxima seção.
Otimizar consultas $lookup
É possível otimizar as consultas $lookup adicionando índices à coleção from, o que permite que a operação encontre documentos correspondentes com eficiência sem verificar toda a coleção.
$lookup com localField e foreignField
Se você estiver usando as opções localField e foreignField na etapa $lookup, crie um índice em foreignField na coleção from.
$lookup com pipelines aninhados
Se você estiver usando a opção pipeline na etapa $lookup com $match
etapas, crie um índice nos campos envolvidos na coleção externa para
evitar uma verificação completa da coleção:
- Para estágios
$matchcom semântica de filtro (por exemplo,{$match: {a: true}}), crie um índice nos campos envolvidos na coleção externa (a). - Para estágios
$matchcom semântica de agregação que compara um campo com um valor constante (por exemplo,{$match: {$expr: {$gt: [a, 10]}}}) ou com comparações de igualdade (eqouin) entre campos e variáveis definidas emlet(por exemplo,{$match: {$expr: {$eq: [a, "$$a"]}}}), crie um índice nos campos envolvidos na coleção externa. O índice de várias chaves não será usado no planejamento.
Criar índices
Siga a documentação de gerenciamento de índices para criar índices. Para garantir que sua consulta possa usar índices, crie índices regulares (sem várias chaves) com campos na seguinte ordem:
- Todos os campos que serão usados em operadores de igualdade. Para maximizar a chance de reutilização em várias consultas, ordene os campos em ordem decrescente de ocorrência nos operadores de igualdade entre as consultas.
- Todos os campos que serão classificados (na mesma ordem).
- Campos que serão usados em operadores de intervalo ou desigualdade em ordem decrescente de seletividade de restrição de consulta.
- Campos que serão retornados como parte de uma consulta no índice: incluir esses campos no índice permite que ele cubra a consulta e evite ter que buscar o documento no armazenamento principal.
Para consultas que envolvem a filtragem e a classificação de campos de matriz, considere criar índices de várias chaves.
Usar dica de consulta
Se você criou um índice mais adequado para a consulta, mas o mecanismo de consulta não usa esse índice, é possível substituir a preferência de índice do mecanismo de consulta usando uma dica de consulta.