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

3 formas de ocultar un índice del plan de consulta en MongoDB

A partir de MongoDB 4.4, ahora podemos ocultar índices del plan de consulta. Esto nos permite evaluar el impacto potencial de eliminar un índice sin eliminarlo realmente.

Si ocultarlo tiene un impacto negativo, podemos mostrar el índice. Esto nos evita tener que eliminar el índice y luego volver a crearlo.

A continuación se muestran 3 formas de ocultar un índice en MongoDB.

El hideIndex() Método

El db.collection.hideIndex() El método hace exactamente lo que promete:oculta el índice (del planificador de consultas).

Ejemplo:

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

Salida:

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

Eso esconde un índice llamado idx_weight_-1 en las pets recopilación. Alternativamente, podríamos proporcionar el patrón clave para el índice en lugar del nombre.

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.

El hideIndex() El método es en realidad un contenedor para el collMod comando de administración (abajo).

El collMod Comando

El collMod El comando de administración nos permite agregar opciones a una colección o modificar las definiciones de vista.

Podemos usarlo para ocultar un índice pasando hidden: true .

Ejemplo:

db.runCommand( {
   collMod: "pets",
   index: {
      name: "idx_weight_-1",
      hidden: true
   }
} )

Resultado:

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

Esto devuelve el mismo documento que hideIndex() regresa.

Similar a hideIndex() , tiene la opción de especificar el nombre del índice o su patrón clave.

Aquí hay un ejemplo del uso del patrón clave:

db.runCommand( {
   collMod: "pets",
   index: {
      keyPattern: { weight : -1 },
      hidden: true
   }
} )

En este caso, el índice se definió usando { weight : -1 } , por lo que esta definición se puede utilizar en lugar del nombre del índice.

Para verificar esto, podemos usar getIndexes() para ver la definición del índice:

db.pets.getIndexes()

Resultado:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	}
]

También podemos mostrar el índice pasando hidden: false .

Crear un índice oculto

La tercera forma de ocultar un índice es crearlo como un índice oculto.

Para hacer esto, use hidden: true como una de las opciones al crear el índice.

Ejemplo:

db.pets.createIndex( 
    { type: 1 },
    { hidden: true }
)

Salida:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}

Ahora llamemos a getIndexes() de nuevo para comprobar nuestro índice oculto recién creado:

db.pets.getIndexes()

Resultado:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	},
	{
		"v" : 2,
		"hidden" : true,
		"key" : {
			"type" : 1
		},
		"name" : "type_1"
	}
]

Podemos ver que se ha creado con "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.