MongoDB - Menganalisis Kueri
Menganalisis kueri adalah aspek yang sangat penting untuk mengukur seberapa efektif database dan desain pengindeksan. Kami akan belajar tentang yang sering digunakan$explain dan $hint pertanyaan.
Menggunakan $ menjelaskan
Itu $explainoperator memberikan informasi tentang kueri, indeks yang digunakan dalam kueri dan statistik lainnya. Ini sangat berguna saat menganalisis seberapa baik indeks Anda dioptimalkan.
Di bab terakhir, kami telah membuat indeks untuk users koleksi di lapangan gender dan user_name menggunakan kueri berikut -
>db.users.createIndex({gender:1,user_name:1})
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
Kami sekarang akan menggunakan $explain pada pertanyaan berikut -
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
Kueri menjelaskan () di atas mengembalikan hasil analisis berikut -
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mydb.users",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
Sekarang kita akan melihat bidang dalam kumpulan hasil ini -
Nilai sebenarnya dari indexOnly menunjukkan bahwa kueri ini telah menggunakan pengindeksan.
Itu cursorkolom menentukan jenis kursor yang digunakan. Jenis BTreeCursor menunjukkan bahwa indeks digunakan dan juga memberikan nama indeks yang digunakan. BasicCursor menunjukkan bahwa pemindaian penuh dilakukan tanpa menggunakan indeks apa pun.
n menunjukkan jumlah dokumen yang cocok dikembalikan.
nscannedObjects menunjukkan jumlah dokumen yang dipindai.
nscanned menunjukkan jumlah dokumen atau entri indeks yang dipindai.
Menggunakan $ hint
Itu $hintoperator memaksa pengoptimal kueri untuk menggunakan indeks yang ditentukan untuk menjalankan kueri. Ini sangat berguna ketika Anda ingin menguji kinerja kueri dengan indeks berbeda. Misalnya, kueri berikut menentukan indeks pada bidanggender dan user_name untuk digunakan untuk kueri ini -
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }
Untuk menganalisis kueri di atas menggunakan $ menjelaskan -
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Yang memberi Anda hasil sebagai berikut -
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mydb.users",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
109
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}