Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2025-08-07 GMT+08:00

Localização de solicitação lenta

No mesmo cenário de serviço, o desempenho da consulta depende do design da arquitetura, bancos de dados, coleções e índices. Um bom design pode melhorar o desempenho da consulta. Pelo contrário, um grande número de consultas lentas (declarações que levam muito tempo para serem executadas) pode ocorrer, o que deteriora o desempenho do sistema.

Este documento descreve as causas e soluções de consultas lentas.

Localização de falha

O DDS permite que você visualize logs de consulta lenta no console. Você pode começar a partir da operação mais lenta registrada no log e otimizar as operações uma por uma.

  • Se uma consulta demorar mais do que 1s, a operação correspondente pode ser anormal. Você precisa analisar o problema com base na situação real.
  • Se uma consulta demorar mais de 10s, a operação precisa ser otimizada.

    Se uma operação agregada demorar mais de 10s, isso é normal.

Método de análise

  1. Conecte-se ao banco de dados.

  2. Execute o seguinte comando para verificar o plano de execução de uma consulta lenta:

    explain()

    Exemplo:

    db.test.find({"data_id" : "ae4b5769-896f-465c-9fbd-3fd2f3357637"}).explain();
    db.test.find({"data_id" : "775f57c2-b63e-45d7-b581-3822dba231b4"}).explain("executionStats");

    Uma consulta coberta não precisa ler um documento, mas retorna diretamente um resultado de um índice, o que é muito eficiente. Você pode usar índices de cobertura, tanto quanto possível. Se a saída de explain() mostra que indexOnly é true, a consulta é coberta por um índice.

  3. Analise o plano de execução.

    1. Verifique o tempo de execução.

      Quanto menores os valores dos seguintes parâmetros, melhor o desempenho: executionStats.executionStages.executionTimeMillisEstimate e executionStats.executionStages.inputStage. executionTimeMillisEstimate

      Tabela 1 Descrição do parâmetro

      Parâmetro

      Descrição

      executionStats.executionTimeMillis

      Seleção do plano de execução e tempo de execução

      executionStats.executionStages.executionTimeMillisEstimate

      Tempo de conclusão da execução do plano de execução

      executionStats.executionStages.inputStage. executionTimeMillisEstimate

      Tempo de conclusão da execução da subfase do plano de execução

    2. Verifique o número de registros digitalizados.

      Se os três itens em Tabela 2 tiverem o mesmo valor, o desempenho da consulta será o melhor.

      Tabela 2 Descrição do parâmetro

      Parâmetro

      Descrição

      executionStats. nReturned

      Número de documentos que correspondem aos critérios de pesquisa

      executionStats .totalKeysExamined

      Número de linhas varridas através de índices

      executionStats .totalDocsExamined

      Número de documentos varridos

    3. Verifique o status do estágio.
      As combinações de status de estágio com melhor desempenho são as seguintes:
      • Fetch+IDHACK
      • Fetch+ixscan,
      • Limit+ (Fetch+ixscan)
      • PROJECTION+ixscan
      Tabela 3 Descrição de status

      Nome do status

      Descrição

      COLLSCAN

      Varredura completa da tabela

      SORT

      Classificação na memória

      IDHACK

      Consulta baseada em _id

      TEXT

      Índice de texto completo

      COUNTSCAN

      Número de índices não utilizados

      FETCH

      Varredura de índice

      LIMIT

      Usar Limit para limitar o número de registros retornados

      SUBPLA

      Estágio de consulta $or sem usar um índice

      PROJECTION

      Número de índices utilizados

      COUNT_SCAN

      Número de índices utilizados

Plano de otimização

  • Para consultas sem índices, crie índices com base nos critérios de pesquisa.
  • Índices de hash podem ser criados para consultas de ponto.
  • Crie índices compostos para consultas de vários campos em que um único campo é altamente repetido.
  • Crie um índice ascendente ou descendente para pesquisas de intervalo com conjuntos de resultados ordenados.
  • Índices compostos são os índices que classificam os resultados da consulta por prefixo, portanto, a sequência de condições de consulta deve ser a mesma dos campos de índice.
  • Para coleções particionadas (tabelas) e coleções grandes (com mais de 100.000 registros), não use consulta difusa (ou não use LIKE) para tabelas com grande quantidade de dados. Como resultado, um grande número de registros é verificado. Você pode consultar dados com base no campo de índice, filtrar pequenas coleções e, em seguida, executar consultas difusas.
  • Não use $not. O MongoDB não indexa dados ausentes. A consulta $not requer que todos os registros sejam verificados em uma única coleção de resultados. Se $not for a única condição de consulta, uma varredura completa da tabela será executada na coleção.
  • Se você usar $and, coloque as condições com o menor número de correspondências antes de outras condições. Se você usar $or, coloque as condições com mais correspondências primeiro.
  • Verifique a linha de base de desempenho das especificações da instância e analise se os requisitos de serviço atuais podem ser atendidos. Se o gargalo de desempenho da instância atual for atingido, atualize as especificações da instância em tempo hábil.