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

Comment fonctionne unhideIndex() dans MongoDB

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.