Dans MongoDB, le db.collection.unhideIndex()
La méthode affiche un index masqué.
Un index caché est un index caché du planificateur de requêtes. Lorsque vous affichez un index, il n'est plus masqué dans le planificateur de requêtes et il est immédiatement disponible pour utilisation.
Exemple
Supposons que nous ayons une collection appelée pets
, et nous voulons le vérifier pour les index cachés. Nous pourrions exécuter la requête suivante pour renvoyer tous les index de la 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", "hidden" : true } ]
Nous pouvons voir qu'il y a trois indices. Le troisième est masqué. Nous le savons, car il a "hidden" : true
.
Cet index est sur le weight
domaine. Lorsque nous exécutons une requête via le plan de requête qui interroge le weight
champ, nous verrons qu'il n'utilise pas l'index.
Exemple :
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 }
Nous pouvons voir qu'il a fait un COLLSCAN
(une analyse de collection), ce qui signifie qu'il n'a pas utilisé l'index.
Afficher l'index
Nous pouvons utiliser le unhideIndex()
méthode pour afficher l'index. Cette méthode accepte le nom de l'index ou son modèle de clé comme paramètre pour spécifier l'index à afficher.
Exemple :
db.pets.unhideIndex("idx_weight_-1")
Sortie :
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
La sortie de unhideIndex()
la méthode affiche l'ancienne valeur pour le hidden
champ (dans ce cas true
) et la nouvelle valeur (dans ce cas false
).
Cependant, si nous affichons un index déjà non masqué (ou en masquons un déjà masqué), ceux-ci ne sont pas affichés et nous obtenons simplement ce qui suit :
{ "ok" : 1 }
Quoi qu'il en soit, l'index est maintenant affiché.
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" : "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 a utilisé IXSCAN
, ce qui signifie qu'il a utilisé l'index.
Vérifiez si l'index a été affiché
Nous pouvons utiliser le getIndexes()
à nouveau pour vérifier si l'index a été affiché ou non.
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 voyons les trois mêmes index que nous avons vus dans l'exemple précédent, mais cette fois nous ne voyons pas "hidden" : true
.
Mais on ne voit pas non plus "hidden" : false
.
Afficher un index supprime simplement le "hidden" : true
partie du résultat de getIndexes()
. Le hidden
l'option n'est disponible que si la valeur est true
. Le hidden
option est une valeur booléenne, on peut donc en déduire que si ce n'est pas "hidden" : true
, alors c'est "hidden" : false
.
Impossible de masquer/afficher 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.