Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Planos de query

Nesta página

  • Planejar o estado de entrada do cache
  • queryHash
  • planCacheKey
  • Disponibilidade

Para qualquer query, o planejador de consulta do MongoDB escolhe e armazena em cache o plano de query mais eficiente de acordo com os índices disponíveis. Para avaliar a eficiência dos planos de query, o planejador de query executa todos os planos candidatos durante um período de teste. Em geral, o plano vencedor é o plano de query que produz mais resultados durante o período de teste enquanto executa a menor quantidade de trabalho.

A entrada de cache do plano associado é usada para queries subsequentes com a mesma forma de query.

O diagrama a seguir ilustra a lógica do planejador de consulta:

Um diagrama da lógica do planejador de queries do MongoDB.
clique para ampliar

Observação

O uso do explain ignora todas as entradas de cache do plano existentes e impede que o planejador de query do MongoDB crie uma nova entrada de cache do plano.

A partir do MongoDB 4.2, cada forma de query está associada a um de três estados no cache:

Estado
Descrição
Ausente

Nenhuma entrada para esta forma existe no cache.

Para uma consulta, se o estado da entrada do cache para um formato de consulta for Ausente:

  1. Os planos de candidatos são avaliados e um plano vencedor é selecionado.

  2. O cache cria uma entrada para a forma de query no estado Inativo com um valor que quantidade de trabalho exigida pelo plano.

A entrada no cache é uma entrada de espaço reservado para esta forma. Ou seja, o planejador viu o formato, calculou um valor que quantidade de trabalho exigido pelo plano e armazenou a entrada do espaço reservado do formato, mas o formato de query não é usado para gerar planos de query.

Para uma consulta, se o estado de entrada de cache para uma forma for Inativo:

  1. Os planos de candidatos são avaliados e um plano vencedor é selecionado.

  2. O valor do plano selecionado que quantidade de trabalho exigido pelo plano é comparado ao da entrada Inativa . Se o valor do plano selecionado for:

    • Menor ou igual à entrada Inativa :

      O plano selecionado substitui a entrada Inativa do espaço reservado e tem um estado Ativo .

      Se antes da substituição acontecer, a entrada Inativa se tornar Ativa (por exemplo, devido a outra operação de query), a entrada recentemente ativa será substituída somente se o valor que quantidade de trabalho exigido pelo plano for maior do que o plano selecionado.

    • Maior do que a entrada Inativa :
      A entrada Inativa permanece, mas seu valor que quantidade de trabalho exigido pelo plano é incrementado.

A entrada no cache é para o plano vencedor. O planejador pode usar esta entrada para gerar planos de consulta.

Para uma query, se o estado da entrada de cache para uma forma for Ativo:

A entrada ativa é usada para gerar planos de consulta.

O planejador também avalia o desempenho da entrada e, se seu valor que quantidade de trabalho exigido pelo plano não atender mais ao critério de seleção, ele fará a transição para o estado Inativo .

Consulte Planejar fluxos de cache para cenários adicionais que acionam alterações no cache do plano.

Para exibir as informações do plano de consulta de uma determinada consulta, você pode usar odb.collection.explain() ou o cursor.explain() .

Para visualizar as informações do cache do plano para uma coleta, você pode usar o estágio de agregação $planCacheStats .

O cache do plano de query não persiste se um mongod reiniciar ou desligar. Além disso:

  • Operações do catálogo, como índice ou collection, limpam o cache do plano.

  • O mecanismo de substituição de cache usado menos recentemente (LRU) limpa a entrada de cache acessada menos recentemente, independentemente do estado.

Os usuários também podem:

Dica

Veja também:

A partir do MongoDB 5.0, o cache do plano salvará entradas plan cache completas somente se o tamanho cumulativo do plan caches para todas as collection for inferior a 0.5 GB. Quando o tamanho cumulativo do para todas as plan caches exceder esse limite, as plan cache adicionais serão armazenadas sem as seguintes informações de depuração:

O tamanho estimado em bytes de uma entrada plan cache está disponível na saída de $planCacheStats.

Para ajudar a identificar queries lentas com a mesma forma de query, cada forma de query está associada a um queryHash. O queryHash é uma string hexadecimal que representa um hash da forma de query e depende somente da forma de query.

Observação

Como em qualquer função de hash, duas formas de query diferentes podem resultar no mesmo valor de hash. No entanto, a ocorrência de colisões de hash entre diferentes formas de query é improvável.

Para fornecer mais informações sobre o cache do plano de query, o MongoDB oferece o planCacheKey.

planCacheKey é um hash da chave para a entrada de cache do plano associada à query.

Observação

Ao contrário do queryHash, o planCacheKey é uma função da forma de query e dos índices atualmente disponíveis para a forma. Ou seja, se os índices que podem suportar a forma de query forem adicionados/descartados, o valor planCacheKey pode mudar, enquanto o valor queryHash não muda.

Por exemplo, considere uma collection foo com os seguintes índices:

db.foo.createIndex( { x: 1 } )
db.foo.createIndex( { x: 1, y: 1 } )
db.foo.createIndex( { x: 1, z: 1 }, { partialFilterExpression: { x: { $gt: 10 } } } )

As seguintes queries na collection têm a mesma forma:

db.foo.explain().find( { x: { $gt: 5 } } ) // Query Operation 1
db.foo.explain().find( { x: { $gt: 20 } } ) // Query Operation 2

Dadas essas consultas, o índice com a expressão de filtro parcial pode suportar a operação de consulta 2, mas não pode suportar a operação de consulta 1. Como os índices disponíveis para suportar a operação de consulta 1 são diferentes da operação de consulta 2, as duas consultas têm planCacheKey diferentes.

Se um dos índices foi descartado ou se um novo índice { x: 1, a: 1 } foi adicionado, o planCacheKey para ambas as operações de consulta será alterado.

O queryHash e o planCacheKey estão disponíveis em:

Os filtros de índice são definidos com o comando planCacheSetFilter e determinam quais índices o planejador avalia para uma forma de query. Uma forma de query consiste em uma combinação de especificações de consulta, classificação e projeção. Se existir um filtro de índice para uma determinada forma de query, o planejador considerará apenas os índices especificados no filtro.

Quando existe um filtro de índice para a forma de consulta, o MongoDB ignora o hint(). Para ver se o MongoDB aplicou um filtro de índice para uma forma de consulta, marque o campo indexFilterSet do método db.collection.explain() ou cursor.explain().

Os filtros de índices afetam apenas os índices que o planejador avalia; o planejador ainda pode selecionar a verificação da collection como o melhor plano para uma determinada forma de query.

Os filtros de índice existem durante o processo do servidor e não persistem após o desligamento. O MongoDB também fornece um comando para remover manualmente os filtros.

Como os filtros de índice substituem o comportamento esperado do planejador, bem como o método hint(), use filtros de índice com moderação.

Iniciando no MongoDB 6.0, um filtro de índice utiliza a coleção definida anteriormente utilizando o comando planCacheSetFilter.

← Desempenho da operação de gravação