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

Savoir si une requête utilise un index dans MongoDB

Dans MongoDB, vous pouvez utiliser le cursor.explain() ou la méthode db.collection.explain() méthode pour déterminer si une requête utilise ou non un index.

Ces méthodes vous permettent d'afficher le plan de requête pour la requête, qui indique si elle utilise ou non un index.

Exemple

Supposons que nous ayons une collection appelée pets , et il contient les documents suivants :

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }

Et supposons que nous créons l'index suivant sur son name champ :

db.pets.createIndex( { "name" : 1 } )

Maintenant, lorsque nous exécutons la requête suivante, elle doit utiliser cet index :

db.pets.find( { "name" : "Scratch" } )

Résultat :

{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }

Mais nous ne pouvons pas dire simplement en regardant les résultats s'il a utilisé l'index ou non.

C'est là que le explain() méthode entre en jeu. Nous pouvons ajouter explain() à la fin de notre requête pour obtenir le plan de requête. Cela nous dira s'il a utilisé ou non un index.

db.pets.find( { "name" : "Scratch" } ).explain()

Résultat :

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"name" : {
				"$eq" : "Scratch"
			}
		},
		"queryHash" : "01AEE5EC",
		"planCacheKey" : "4C5AEA2C",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"name" : 1
				},
				"indexName" : "name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"name" : [
						"[\"Scratch\", \"Scratch\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Nous pouvons voir par la partie qui lit IXSCAN que la requête utilise un parcours d'index pour produire ses résultats.

En revanche, si nous faisons de même pour une requête qui n'est pas incluse dans notre index, nous verrons qu'elle utilise un scan de collection (COLLSCAN ):

db.pets.find( { "type" : "Dog" } ).explain()

Résultat :

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"type" : {
				"$eq" : "Dog"
			}
		},
		"queryHash" : "2A1623C7",
		"planCacheKey" : "2A1623C7",
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"type" : {
					"$eq" : "Dog"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Le db.collection.explain() Méthode

Le db.collection.explain() la méthode est similaire à cursor.explain() , sauf qu'avec db.collection.explain() , vous pouvez enchaîner des modificateurs de requête supplémentaires à la requête (après le find() méthode).

Pour nos besoins, nous pouvons faire ce qui suit :

db.pets.explain().find( { "name": "Scratch" } )

Résultat :

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"name" : {
				"$eq" : "Scratch"
			}
		},
		"queryHash" : "01AEE5EC",
		"planCacheKey" : "4C5AEA2C",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"name" : 1
				},
				"indexName" : "name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"name" : [
						"[\"Scratch\", \"Scratch\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Vous pouvez exécuter la commande suivante pour récupérer une liste des modificateurs de requête disponibles pour cette méthode :

db.collection.explain().find().help()