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

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

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

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

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.

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 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:

  • Adicionar filtros seletivos e indexar 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 collection 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 curinga 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 do volume 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 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.

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 sistemas do Atlas , confirme se as métricas em nível de query e cluster retornaram aos intervalos 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 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

Voltar

Bloquear queries lentas

Nesta página