MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

3 façons de masquer un index du plan de requête dans MongoDB

À partir de MongoDB 4.4, nous pouvons désormais masquer les index du plan de requête. Cela nous permet d'évaluer l'impact potentiel de la suppression d'un index sans supprimer réellement l'index.

Si le masquer a un impact négatif, nous pouvons afficher l'index. Cela nous évite d'avoir à supprimer l'index, puis à le recréer.

Vous trouverez ci-dessous 3 façons de masquer un index dans MongoDB.

Le hideIndex() Méthode

Le db.collection.hideIndex() La méthode fait exactement ce qu'elle promet - elle masque l'index (du planificateur de requêtes).

Exemple :

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

Sortie :

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

Cela cache un index appelé idx_weight_-1 sur les pets le recueil. Nous pourrions également fournir le modèle de clé pour l'index au lieu du nom.

La sortie de hideIndex() la méthode affiche l'ancienne valeur pour le hidden champ (dans ce cas false ) et la nouvelle valeur (dans ce cas true ).

Cependant, si nous masquons un index déjà masqué (ou démasquons un index déjà non masqué), ceux-ci ne sont pas affichés et nous obtenons simplement ce qui suit :

{ "ok" : 1 }

Dans tous les cas, l'index est désormais masqué.

Le hideIndex() est en fait un wrapper pour le collMod commande d'administration (ci-dessous).

Le collMod Commande

Le collMod La commande d'administration nous permet d'ajouter des options à une collection ou de modifier les définitions de vue.

On peut l'utiliser pour masquer un index en passant hidden: true .

Exemple :

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

Résultat :

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

Cela renvoie le même document que hideIndex() renvoie.

Similaire à hideIndex() , vous avez la possibilité de spécifier le nom de l'index ou son modèle de clé.

Voici un exemple d'utilisation du modèle de clé :

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

Dans ce cas, l'index a été défini en utilisant { weight : -1 } , et donc cette définition peut être utilisée à la place du nom de l'index.

Pour vérifier cela, nous pouvons utiliser getIndexes() pour voir la définition de l'index :

db.pets.getIndexes()

Résultat :

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

On peut aussi afficher l'index en passant hidden: false .

Créer un index masqué

La troisième façon de masquer un index consiste à le créer en tant qu'index masqué.

Pour ce faire, utilisez hidden: true comme l'une des options lorsque vous créez l'index.

Exemple :

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

Sortie :

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

Appelons maintenant getIndexes() à nouveau pour vérifier notre index caché nouvellement créé :

db.pets.getIndexes()

Résultat :

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

On peut voir qu'il a été créé avec "hidden": true .

Vous ne pouvez pas masquer les index ? Vérifiez ce paramètre.

Le mongod featureCompatibilityVersion doit être au moins 4.4 avant de pouvoir masquer les index. Cependant, une fois caché, un index restera caché même avec featureCompatibilityVersion défini sur 4.2 sur les binaires MongoDB 4.4.

Vous pouvez vérifier le featureCompatibilityVersion paramètre avec le code suivant :

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Vous pouvez le définir à l'aide de setFeatureCompatibilityVersion commande :

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

Le setFeatureCompatibilityVersion la commande doit être exécutée dans admin base de données.

Notez également que vous ne pouvez pas masquer le _id indice.