sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo funciona hideIndex() en MongoDB

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.