MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cari Tahu apakah Kueri menggunakan Indeks di MongoDB

Di MongoDB, Anda dapat menggunakan cursor.explain() metode atau db.collection.explain() metode untuk menentukan apakah kueri menggunakan indeks atau tidak.

Metode ini memungkinkan Anda untuk melihat rencana kueri untuk kueri, yang mencakup apakah itu menggunakan indeks atau tidak.

Contoh

Misalkan kita memiliki koleksi yang disebut pets , dan berisi dokumen berikut:

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

Dan misalkan kita membuat indeks berikut pada name its bidang:

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

Sekarang ketika kita menjalankan kueri berikut, itu harus menggunakan indeks itu:

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

Hasil:

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

Tapi kita tidak bisa tahu hanya dengan melihat hasilnya apakah menggunakan indeks atau tidak.

Di sinilah explain() metode masuk. Kita dapat menambahkan explain() ke akhir kueri kami untuk mendapatkan paket kueri. Itu akan memberi tahu kita apakah itu menggunakan indeks atau tidak.

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

Hasil:

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

Kita bisa melihat pada bagian yang bertuliskan IXSCAN bahwa kueri menggunakan pemindaian indeks untuk menghasilkan hasilnya.

Sebaliknya, jika kami melakukan hal yang sama untuk kueri yang tidak disertakan dalam indeks kami, kami akan melihat bahwa kueri tersebut menggunakan pemindaian koleksi (COLLSCAN ):

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

Hasil:

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

The db.collection.explain() Metode

db.collection.explain() metode ini mirip dengan cursor.explain() , kecuali dengan db.collection.explain() , Anda dapat menghubungkan pengubah kueri tambahan ke kueri (setelah find() metode).

Untuk tujuan kita, kita dapat melakukan hal berikut:

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

Hasil:

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

Anda dapat menjalankan perintah berikut untuk mengambil daftar pengubah kueri yang tersedia untuk metode ini:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 5 Cara Memeriksa Ukuran Koleksi di MongoDB

  2. Temukan apakah seseorang berulang tahun dalam 30 hari ke depan dengan mongo

  3. Cara menggunakan Enkripsi untuk Melindungi data MongoDB

  4. Bagaimana cara melewatkan ObjectId dari MongoDB di MVC.net

  5. Cara Menyebarkan MongoDB untuk Ketersediaan Tinggi