MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dowiedz się, czy zapytanie używa indeksu w MongoDB

W MongoDB możesz użyć cursor.explain() lub db.collection.explain() metoda do określenia, czy zapytanie korzysta z indeksu.

Te metody umożliwiają przeglądanie planu kwerendy dla kwerendy, który obejmuje, czy używa indeksu.

Przykład

Załóżmy, że mamy kolekcję o nazwie pets i zawiera następujące dokumenty:

{ "_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 }

I załóżmy, że tworzymy następujący indeks dla jego name pole:

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

Teraz, gdy uruchamiamy następujące zapytanie, powinno ono używać tego indeksu:

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

Wynik:

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

Ale nie możemy stwierdzić, po prostu patrząc na wyniki, czy użyto indeksu, czy nie.

W tym miejscu explain() przychodzi metoda. Możemy dołączyć explain() do końca naszego zapytania, aby uzyskać plan zapytania. To powie nam, czy używał indeksu, czy nie.

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

Wynik:

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

Widzimy po części, która czyta IXSCAN że zapytanie wykorzystuje skanowanie indeksu w celu uzyskania wyników.

W przeciwieństwie do tego, jeśli zrobimy to samo dla zapytania, które nie jest uwzględnione w naszym indeksie, zobaczymy, że używa ono skanowania kolekcji (COLLSCAN ):

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

Wynik:

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

db.collection.explain() Metoda

db.collection.explain() metoda jest podobna do cursor.explain() , z wyjątkiem tego z db.collection.explain() , możesz połączyć dodatkowe modyfikatory zapytania z zapytaniem (po find() metoda).

Do naszych celów możemy wykonać następujące czynności:

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

Wynik:

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

Możesz uruchomić następujące polecenie, aby pobrać listę modyfikatorów zapytań dostępnych dla tej metody:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB — A co z wartością dziesiętną?

  2. Wdrażanie MongoDB za pomocą Docker

  3. Uwierzytelnianie MongoDB 3.2 nie powiodło się

  4. Mongodb - Nieprawidłowy znak błędu Mongoimport

  5. MongoDB $toInt