Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Menu Docs
Página inicial do Docs
/ /

Solucionar problemas de queries lentas em produção

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.

Para confirmar se seu sistema está encontrando problemas com consultas lentas, verifique o seguinte:

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.

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.

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

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.

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

As seções a seguir descrevem causas comuns de queries lentas e como resolvê-las.

Os seguintes problemas de indexação podem causar queries lentas.

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.

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

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.

Os seguintes problemas de esquema e design de query podem causar queries lentas.

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.

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:

  • Adicionar filtros seletivos e indexação de campos de query

  • Usando padrões de paginação em vez de grandes skip() ou limit() combinações

  • Limitar as janelas de tempo para dados de séries temporais ou ajustar a granularidade da própria coleção subjacente se ela for muito fina.

Alguns operadores de query e padrões impedem que o MongoDB use índices de forma eficiente:

  • $regex com um wildcard principal

  • $nin

  • Listas de $in muito grandes

  • Excesso de $or ramificações

  • $ne expressõ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.

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.

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.

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.

  • 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.

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 representativas

  • Trechos 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

Voltar

Bloquear queries lentas

Nesta página