MongoDB a introduit le db.collection.hideIndex()
méthode dans MongoDB 4.4.
Cette méthode masque un index existant du planificateur de requêtes. Cela vous 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, vous pouvez utiliser db.collection.unhideIndex()
pour afficher l'index. Cela vous évite d'avoir à supprimer l'index, puis à le recréer.
Exemple
Supposons que nous ayons une collection appelée pets
. Renvoyons les index actuels sur cette collection.
db.pets.getIndexes()
Résultat :
[ { "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" } ]
Nous pouvons voir qu'il a trois index. Choisissons le troisième appelé idx_weight_-1
pour notre exemple.
Voyons d'abord à quoi ressemble le plan de requête lorsque nous exécutons des requêtes qui utilisent cet index.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Ici, nous recherchons des animaux de compagnie qui dépassent un certain poids. Nous utilisons le explain()
méthode pour afficher le plan de requête au lieu des résultats réels.
Voici à quoi ressemble le plan de requête pour cette requête :
{ "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 }
Nous pouvons voir qu'il utilise IXSCAN
ce qui signifie qu'il a utilisé l'index.
Maintenant, masquons l'index.
Masquer l'index
C'est là que hideIndex()
Nous pouvons l'utiliser pour masquer l'index afin qu'il n'apparaisse pas sur le plan de requête comme dans l'exemple précédent.
db.pets.hideIndex("idx_weight_-1")
Sortie :
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
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é.
Vérifier à nouveau le plan de requête
Exécutons à nouveau la requête précédente pour voir à quoi ressemble le plan de requête maintenant.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Résultat :
{ "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 }
Cette fois, nous obtenons un COLLSCAN
, ce qui signifie qu'il n'a pas utilisé l'index ; il a effectué une analyse de la collection.
Vérifier si un index est masqué
Vous pouvez utiliser le getIndexes()
méthode pour vérifier si un index est masqué ou non.
Ainsi, nous pouvons exécuter la même requête que nous avons exécutée précédemment pour renvoyer tous les index :
db.pets.getIndexes()
Résultat :
[ { "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 } ]
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.