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
- Conecte-se ao banco de dados.
- Para conectar-se a uma instância de cluster, consulte Conexão a uma instância de cluster.
- Para se conectar a uma instância de conjunto de réplicas, consulte Conexão a uma instância de conjunto de réplicas.
- Para obter detalhes sobre como se conectar a uma instância de nó único, consulte Conexão a uma instância de nó único.
- 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.
- Analise o plano de execução.
- 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
- 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.
- 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
- Verifique o tempo de execução.
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.