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 janelas 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 do sistema
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 Monitorando uma implementação autogerenciada 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 aplicação
Alterações no índice
Migrações de esquema
Redimensionamento de sistemas
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 collection 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 com explain a "executionStats" “allPlansExecution” opção ou para alta verbosidade. 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 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 sort() seguinte:
Criação de índices compostos que correspondam ao filtro de query e aos padrões de classificação
Reduzindo o tamanho do conjunto de resultados antes de classificar
Aggregation Pipelines Ineficientes
Os pipelines de agregação devem usar,$match $sortou 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 intervalos de tempo são mais lentas do que aquelas que impõem filtros e limites rígidos. Você pode melhorar o desempenho da query fazendo o seguinte:
Operadores ou padrões de query ineficientes
Alguns operadores de query e padrões impedem que o MongoDB use índices de forma eficiente:
$regexcom um curinga 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 do volume de trabalho se as queries já estiverem otimizadas.
Volumes de trabalho contidos e problemas de simultaneidade
Operações de longa duração podem bloquear ou interferir em outras queries. Por exemplo:
Construções de grandes índices
Digitalizações de collections
Escritas pesadas
Use para identificar operações de bloqueio ou de longa duração. Considere agendar operações pesadas durante janelas de manutenção. Por exemplo, considere a execução de compilações de índice em grandes coleções durante as janelas de $currentOp manutenção.
Topologia ou configuração incorreta da read preference
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 sistemas do Atlas , confirme se as métricas em nível de query e cluster retornaram aos intervalos 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 registro relevantes e amostras de profiler cobrindo o período em que ocorre a lentidão
Alterações recentes em:
Esquema ou índices
Tamanho, nível ou topologia do sistema
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 implementação:
Atlas versus autogerenciado
Perfil de hardware
Configuração de fragmentação
Configuração de replicação