O MongoDB introduziu o
db.collection.hideIndex()
método no MongoDB 4.4. Esse método oculta um índice existente do planejador de consulta. Isso permite que você avalie o impacto potencial de descartar um índice sem realmente descartar o índice.
Se ocultá-lo tiver um impacto negativo, você pode usar
db.collection.unhideIndex()
para exibir o índice. Isso evita que você tenha que descartar o índice e recriá-lo. Exemplo
Suponha que tenhamos uma coleção chamada
pets
. Vamos retornar os índices atuais nessa coleção. db.pets.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1" } ]
Podemos ver que ele tem três índices. Vamos escolher o terceiro chamado
idx_weight_-1
para o nosso exemplo. Primeiro, vamos ver como é o plano de consulta quando executamos consultas que usam esse índice.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Aqui, estamos procurando por animais de estimação que estão acima de um certo peso. Estamos usando o
explain()
método para exibir o plano de consulta em vez dos resultados reais. Veja como é o plano de consulta para esta consulta:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "weight" : -1 }, "indexName" : "idx_weight_-1", "isMultiKey" : false, "multiKeyPaths" : { "weight" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "weight" : [ "[inf.0, 10.0)" ] } } }, "rejectedPlans" : [ ] }, "ok" : 1 }
Podemos ver que ele usa
IXSCAN
o que significa que ele usou o índice. Agora vamos ocultar o index.
Ocultar o índice
É aqui que
hideIndex()
Podemos usá-lo para ocultar o índice para que ele não apareça no plano de consulta como no exemplo anterior. db.pets.hideIndex("idx_weight_-1")
Saída:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
A saída do
hideIndex()
método exibe o valor antigo para o hidden
campo (neste caso false
) e o novo valor (neste caso true
). No entanto, se ocultarmos um índice já oculto (ou exibir um já não oculto), eles não serão exibidos e obteremos apenas o seguinte:
{ "ok" : 1 }
De qualquer forma, o índice agora está oculto.
Verifique novamente o plano de consulta
Vamos executar novamente a consulta anterior para ver como está o plano de consulta agora.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultado:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "weight" : { "$gt" : 10 } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
Desta vez temos um
COLLSCAN
, o que significa que ele não usou o índice – ele fez uma varredura de coleção. Verificar se um índice está oculto
Você pode usar o
getIndexes()
método para verificar se um índice está ou não oculto. Assim, podemos executar a mesma consulta que executamos anteriormente para retornar todos os índices:
db.pets.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true } ]
Não é possível ocultar índices? Verifique esta configuração.
O
mongod
featureCompatibilityVersion
deve ser pelo menos 4.4
antes que você possa ocultar índices. No entanto, uma vez oculto, um índice permanecerá oculto mesmo com featureCompatibilityVersion
definido como 4.2 nos binários do MongoDB 4.4. Você pode verificar a
featureCompatibilityVersion
configuração com o seguinte código:db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Você pode configurá-lo usando o
setFeatureCompatibilityVersion
comando:db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
A
setFeatureCompatibilityVersion
comando precisa ser executado no admin
base de dados. Observe também que você não pode ocultar o
_id
índice.