Esta página aborda causas e soluções comuns para queries lentas. Se você precisar de suporte adicional depois de passar pelas seções a seguir, entre em contato com o Suporte técnico.
Verificações de pré-requisitos
Para confirmar se seu sistema está encontrando problemas com consultas lentas, verifique o seguinte:
Confirmar queries lentas
Para confirmar se as queries são realmente lentas, compare a latência atual da query com linhas de base históricas ou objetivos de nível de serviço. Identifique se a lentidão é constante ou ocorre durante padrões de carregamento específicos, como picos de carregamento, tarefas em lote ou períodos de manutenção.
Identificar consultas lentas
Use o profiler de banco de dados e os registros de queries lentas para identificar operações específicas por namespace, padrão e latência.
Para Atlas, use o Performance Advisor e o Analisador de query para encontrar queries com alto tempo de execução.
Verificar a integridade da implantação
Confirme a integridade do cluster e do nó. Verifique se há problemas com:
Estado primário/secundário
atraso de replicação
Eleições frequentes
Disponibilidade do nó
Failovers
Node restarts
Erros de armazenamento que ocorrem ao mesmo tempo que períodos de query lentos
Verificar a utilização de recursos
Inspecione a CPU, a memória, a E/S do disco e a utilização do disco em cada nó, confirmando que não há saturação sustentada. Para obter detalhes, consulte monitoramento de uma implantação autogerenciado do MongoDB.
No Atlas, revise os painéis de métricas em busca de picos de CPU, IOPS, conexões e falhas de página em torno do tempo de queries lentas.
Confirmar alterações recentes
Determine se alguma alteração recente ocorreu ao mesmo tempo que as queries lentas, como:
Liberando um aplicativo
Alterações no índice
Migrações de esquema
Redimensionamento de implantação
Alterações de parâmetros
Problemas e Resoluções Comuns
As seções a seguir descrevem causas comuns de queries lentas e como resolvê-las.
Problemas de indexação
Os seguintes problemas de indexação podem causar queries lentas.
Índices ausentes ou abaixo do ideal
As queries que executam varreduras de coleção ou usam índices não seletivos podem causar alta latência sob a carga de produção. Identifique as queries que não usam o índice esperado usando explain com a opção "executionStats" ou “allPlansExecution” para alto detalhamento. Essas opções mostram métricas de execução para todos os planos durante a fase de avaliação. Crie ou refine índices para os campos utilizados para filtrar e classificar resultados da query.
Classifica sem índices de suporte
Queries com sort() que não podem usar um índice exigem uma classificação na memória. Isso é especialmente lento em grandes conjuntos de resultados. Você pode melhorar o desempenho fazendo o seguinte:
Criação de índices compostos que correspondam ao filtro de queries e aos padrões de classificação
Reduzindo o tamanho do conjunto de resultados antes de classificar
Pipelines de Agregação Ineficientes
Os pipelines de agregação devem usar $match, $sort ou outros estágios seletivos antecipadamente, para filtrar o conjunto de dados e evitar o processamento de grandes volumes de dados na memória. Se o seu pipeline tiver estágios $match ou $sort atrasados, mova-os mais cedo sempre que possível.
Você também pode melhorar o desempenho criando índices em campos usados nos estágios iniciais do pipeline.
Problemas de design de esquema e query
Os seguintes problemas de esquema e design de query podem causar queries lentas.
Problemas de tamanho de esquema e documento
Documentos muito grandes, arrays ilimitadas e estruturas altamente aninhadas aumentam a E/S e a CPU por operação. Você pode aumentar o desempenho identificando coleções com documentos incomumente grandes ou arrays amplas e atualizando o esquema para usar agrupamento ou referência sempre que possível.
Queries ilimitadas e varreduras de coleções
As queries que analisam grandes coleções ou faixas de tempo são mais lentas do que aquelas que forçam filtros e limites rígidos. Você pode melhorar o desempenho da query fazendo o seguinte:
Operadores de query ou padrões ineficientes
Alguns operadores de query e padrões impedem que o MongoDB use índices de forma eficiente:
$regexcom um wildcard principalListas de
$inmuito grandesExcesso de
$orramificações$neexpressões de negação que impacto negativamente a verificação do índice
Para melhorar o desempenho, reescreva os predicados para serem compatíveis com o índice. Considere campos regex aninhados e pré-computados sempre que possível.
Saturação de recursos
Queries lentas podem ser causadas pela contenção de recursos de hardware subjacentes sob a carga de produção. Verifique se há uma correlação entre os picos de latência de query e as métricas de utilização de CPU, IOPS e cache. Considere o dimensionamento vertical e/ou horizontal ou a redistribuição da carga de trabalho se as queries já estiverem otimizadas.
Cargas de trabalho contidas e problemas de simultaneidade
Operações de longa duração podem bloquear ou interferir em outras queries. Por exemplo:
Construções de índice grandes
varredura de coleção
Escritas pesadas
Use $currentOp para identificar operações de bloqueio ou de longa duração. Considere agendar operações pesadas durante período de manutenção. Por exemplo, considere a execução de construções de índice em grandes coleções durante os períodos de manutenção.
Topologia ou configuração incorreta da preferência de leitura
Queries roteadas para secundários com atraso de replicação ou hardware menos capaz podem causar respostas mais lentas. Revise as preferências de leitura do driver e as write concerns. Garanta que queries críticas de latência sejam direcionadas para os nós apropriados.
Verificar resolução
Execute novamente queries representativas e compare a latência com os resultados anteriores e as metas desejadas.
Confirme que
explain("executionStats")mostra trabalho reduzido, como menos documentos examinados e uso de índice aprimorado.Revise o profiler e os registros de query lenta para verificar:
As queries lentas anteriores não aparecem mais.
Os tempos de query e o uso de recursos diminuíram.
Para implantações do Atlas, confirme se as métricas em nível de query e cluster retornaram às faixas normais após as alterações.
Coletar diagnósticos adicionais para suporte do MongoDB
Se você precisar de suporte adicional, colete as seguintes informações:
Amostra de queries lentas com filtro completo e qualquer projeção, classificação e opções aplicáveis, incluindo:
Frequência aproximada
Latência esperada versus latência observada
explain("executionStats")saída para queries lentas representativasTrechos de log relevantes e amostras de profiler cobrindo o período em que ocorre a lentidão
Alterações recentes em:
Esquema ou índices
Tamanho, tier ou topologia da implantação
Versão do aplicativo ou padrões de query
Métricas de cluster ou estatísticas em nível de host mostrando CPU, memória, E/S de disco e uso de conexão em torno do tempo de queries lentas.
Detalhes sobre o ambiente de implantação:
Atlas versus autogerenciado
Perfil de hardware
Configuração de fragmentação
Configuração de replicação