Planos de query
Para qualquer query, o planejador de queries do MongoDB escolhe e armazena em cache o plano de query mais eficiente, considerando os índices disponíveis. Para avaliar a eficiência dos planos de query, o planejador de queries executa todos os planos candidatos durante um período de avaliação. Em geral, o plano vencedor é o plano de query que produz mais resultados durante o período de avaliação 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:
Observação
Usar 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.
Planejar o estado de entrada do cache
Cada forma de query de cache de plano está associada a um dos três estados no cache:
Estado | Descrição |
---|---|
Nenhuma entrada para esta forma existe no cache. Para uma consulta, se o estado da entrada do cache para um forma de query for Ausente:
| |
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:
| |
A entrada no cache é para o plano vencedor. O planejador pode usar esta entrada para gerar planos de consulta. Para uma consulta, 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 Fluxos de cache do plano para cenários adicionais que acionam alterações no cache do plano.
Plano de query e informações de cache
Para exibir as informações do plano de consulta de uma determinada consulta, você pode usar odb.collection.explain()
ou o cursor.explain()
.
Para ver informações de cache de plano para uma coleção, é possível usar o estágio de agregação $planCacheStats
.
Planejar descargas de cache
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:
Limpe manualmente todo o cache do plano usando o método
PlanCache.clear()
.Limpe manualmente entradas de cache do plano específico utilizando o método
PlanCache.clearPlansByQuery()
.
Limite de tamanho das informações de depuração do cache do plano
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 coleções for inferior a 0.5 GB. Quando o tamanho cumulativo do plan caches
para todas as coleções exceder esse limite, as entradas 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
.
queryHash
e a planCacheKey
queryHash
Para ajudar a identificar queries lentas com a mesma forma de query, cada forma de query é 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.
planCacheKey
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.
Disponibilidade
O queryHash
e o planCacheKey
estão disponíveis em:
campos de saída explain():
queryPlanner.queryHash
equeryPlanner.planCacheKey
mensagens de log do profiler e mensagens de log de diagnóstico (ou seja, mensagens de log mongod/Mongo ) ao registrar consultas lentas.
$planCacheStats
estágio de agregaçãoPlanCache.listQueryShapes()
comando de método/planCacheListQueryShapes
PlanCache.getPlansByQuery()
comando de método/planCacheListPlans
Filtros de índice
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
.