MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Разберете дали една заявка използва индекс в MongoDB

В MongoDB можете да използвате cursor.explain() метод или db.collection.explain() метод за определяне дали дадена заявка използва индекс или не.

Тези методи ви позволяват да видите плана на заявката за заявката, който включва дали използва индекс или не.

Пример

Да предположим, че имаме колекция, наречена pets , и съдържа следните документи:

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

И да предположим, че създаваме следния индекс върху неговото name поле:

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

Сега, когато изпълним следната заявка, тя трябва да използва този индекс:

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

Резултат:

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

Но не можем да разберем само като погледнем резултатите дали е използвал индекса или не.

Това е мястото, където explain() идва методът. Можем да добавим explain() до края на нашата заявка, за да получите плана на заявката. Това ще ни покаже дали е използвал индекс или не.

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

Резултат:

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

Можем да видим от частта, която чете IXSCAN че заявката използва индексно сканиране, за да произведе своите резултати.

За разлика от това, ако направим същото за заявка, която не е включена в нашия индекс, ще видим, че използва сканиране на колекция (COLLSCAN ):

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

Резултат:

{
	"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() Метод

db.collection.explain() методът е подобен на cursor.explain() , с изключение на това с db.collection.explain() , можете да свържете допълнителни модификатори на заявка към заявката (след find() метод).

За нашите цели можем да направим следното:

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

Резултат:

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

Можете да изпълните следната команда, за да извлечете списък с модификатори на заявка, налични за този метод:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Битката на базите данни NoSQL - Сравняване на MongoDB и CouchDB

  2. „Грешка при прекратяване на връзката на сокетния файл в MongoDB 3.0

  3. Как да управлявате бази данни и колекции в MongoDB

  4. Как да настроите FeatureCompatibilityVersion в MongoDB

  5. $unionWith – Еквивалент на MongoDB на UNION ALL