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

Cómo funciona unhideIndex() en MongoDB

En MongoDB, el db.collection.unhideIndex() El método muestra un índice oculto.

Un índice oculto es uno que está oculto del planificador de consultas. Cuando muestra un índice, ya no está oculto para el planificador de consultas y está disponible de inmediato para su uso.

Ejemplo

Supongamos que tenemos una colección llamada pets , y queremos verificar si hay índices ocultos. Podríamos ejecutar la siguiente consulta para devolver todos los índices de la 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",
		"hidden" : true
	}
]

Podemos ver que hay tres índices. El tercero está oculto. Lo sabemos porque tiene "hidden" : true .

Ese índice está en el weight campo. Cuando ejecutamos una consulta a través del plan de consulta que consulta el weight campo, veremos que no usa el índice.

Ejemplo:

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
}

Podemos ver que hizo un COLLSCAN (una exploración de colección), lo que significa que no usó el índice.

Mostrar el índice

Podemos usar el unhideIndex() método para mostrar el índice. Este método acepta el nombre del índice o su patrón clave como parámetro para especificar qué índice mostrar.

Ejemplo:

db.pets.unhideIndex("idx_weight_-1")

Salida:

{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }

La salida de unhideIndex() El método muestra el valor antiguo de hidden campo (en este caso true ) y el nuevo valor (en este caso false ).

Sin embargo, si mostramos un índice que ya no está oculto (u ocultamos uno que ya está oculto), estos no se muestran y solo obtenemos lo siguiente:

{ "ok" : 1 }

Independientemente, el índice ahora no 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" : "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 usó IXSCAN , lo que significa que usó el índice.

Comprobar si el índice no se ha ocultado

Podemos usar getIndexes() de nuevo para comprobar si el índice se ha desocultado o no.

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"
	}
]

Vemos los mismos tres índices que vimos en el ejemplo anterior, pero esta vez no vemos "hidden" : true .

Pero tampoco vemos "hidden" : false .

Mostrar un índice simplemente elimina el "hidden" : true parte del resultado de getIndexes() . El hidden la opción solo está disponible si el valor es true . El hidden option es un valor booleano, por lo que podemos inferir que si no es "hidden" : true , entonces es "hidden" : false .

¿No puede ocultar/mostrar í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.