MongoDB introdujo el db.collection.hideIndex()
método en MongoDB 4.4.
Este método oculta un índice existente del planificador de consultas. Esto le permite evaluar el impacto potencial de eliminar un índice sin eliminarlo realmente.
Si ocultarlo tiene un impacto negativo, puede usar db.collection.unhideIndex()
para mostrar el índice. Esto le evita tener que eliminar el índice y luego volver a crearlo.
Ejemplo
Supongamos que tenemos una colección llamada pets
. Devolvamos los índices actuales de esa colección.
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 tiene tres índices. Elijamos el tercero llamado idx_weight_-1
para nuestro ejemplo.
Primero, veamos cómo se ve el plan de consulta cuando ejecutamos consultas que usan ese índice.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Aquí, estamos buscando mascotas que superen cierto peso. Estamos usando explain()
método para mostrar el plan de consulta en lugar de los resultados reales.
Así es como se ve el plan 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 usa IXSCAN
lo que significa que usó el índice.
Ahora ocultemos el índice.
Ocultar el Índice
Aquí es donde hideIndex()
entra. Podemos usarlo para ocultar el índice para que no aparezca en el plan de consulta como lo hizo en el ejemplo anterior.
db.pets.hideIndex("idx_weight_-1")
Salida:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
La salida de hideIndex()
El método muestra el valor antiguo de hidden
campo (en este caso false
) y el nuevo valor (en este caso true
).
Sin embargo, si ocultamos un índice ya oculto (o mostramos uno que ya no está oculto), estos no se muestran y solo obtenemos lo siguiente:
{ "ok" : 1 }
En cualquier caso, el índice ahora está oculto.
Vuelva a comprobar el plan de consulta
Volvamos a ejecutar la consulta anterior para ver cómo se ve el plan de consulta ahora.
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 }
Esta vez obtenemos un COLLSCAN
, lo que significa que no utilizó el índice, sino que realizó un análisis de la colección.
Comprobar si un índice está oculto
Puede usar getIndexes()
método para verificar si un índice está oculto o no.
Entonces, podemos ejecutar la misma consulta que ejecutamos anteriormente para devolver todos los í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 } ]
¿No puede ocultar índices? Compruebe esta configuración.
El mongod
featureCompatibilityVersion
debe ser al menos 4.4
antes de poder ocultar índices. Sin embargo, una vez oculto, un índice permanecerá oculto incluso con featureCompatibilityVersion
establecido en 4.2 en binarios MongoDB 4.4.
Puede consultar la featureCompatibilityVersion
configuración con el siguiente código:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Puede configurarlo usando setFeatureCompatibilityVersion
comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
el comando debe ejecutarse en el admin
base de datos.
También tenga en cuenta que no puede ocultar el _id
índice.