Bab ini memperkenalkan analisis kinerja kueri MongoDB, mirip dengan explain pada SQL, MongoDB juga mendukung explain untuk menganalisis kinerja pernyataan kueri.

Penggunaan Dasar

Dengan memanggil fungsi explain, Anda dapat memperoleh hasil analisis

// Hasil analisis dari metode find
db.collection.find({}).explain();

// Hasil analisis dari metode aggregate
db.collection.explain().aggregate([]);

explain memiliki tiga mode:

  • queryPlanner (default)
  • executionStats
  • allPlansExecution

Penjelasan:

  • Menggunakan queryPlanner hanya mencantumkan semua rencana eksekusi yang mungkin, tidak mengeksekusi pernyataan sebenarnya, dan menampilkan rencana winningPlan yang sudah menang.
  • Menggunakan executionStats mengeksekusi hanya rencana winningPlan dan mengeluarkan hasilnya.
  • Menggunakan allPlansExecution mengeksekusi semua rencana dan mengeluarkan hasilnya.

Penggunaan mode yang berbeda

// mode executionStats, cukup lewati parameter ke fungsi explain
db.collection.find({}).explain('executionStats');

// mode allPlansExecution
db.collection.find({}).explain('allPlansExecution');

Penjelasan konten explain

Konten queryPlanner

Konten berikut adalah konten default yang dikembalikan oleh explain, mengabaikan informasi non-key

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // Metrik kunci, apakah pengindeksan data digunakan
		"winningPlan" : {
			"stage" : "COLLSCAN",  // Metrik kunci, nama tahap fase. Setiap fase memiliki informasi khusus fase, contohnya, COLLSCAN mewakili pemindaian seluruh konten koleksi
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

Tipe tahap fase adalah sebagai berikut:

  • COLLSCAN: Pemindaian tabel penuh
  • IXSCAN: Pemindaian indeks
  • FETCH: Mengambil dokumen tertentu berdasarkan indeks
  • SHARD_MERGE: Menggabungkan data yang dikembalikan oleh setiap shard
  • SORT: Menunjukkan penyortiran dalam memori
  • LIMIT: Batasi jumlah yang dikembalikan
  • SKIP: Lewati menggunakan
  • IDHACK: Kueri untuk _id
  • SHARDING_FILTER: Kueri data yang di-shard melalui mongos
  • COUNT: Operasi hitung menggunakan db.coll.explain().count() atau serupa
  • COUNTSCAN: Tahap pengembalian ketika menghitung tidak menggunakan indeks untuk menghitung
  • COUNT_SCAN: Tahap pengembalian ketika menghitung menggunakan indeks untuk menghitung
  • SUBPLA: Tahap pengembalian untuk kueri $or yang tidak menggunakan indeks
  • TEXT: Tahap pengembalian saat mengkueri menggunakan indeks teks penuh
  • PROJECTION: Tahap pengembalian untuk membatasi bidang yang dikembalikan

Konten executionStats

Konten berikut adalah konten yang dikembalikan dalam mode executionStats, mengabaikan informasi non-key

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // Jumlah dokumen yang dikembalikan
		"executionTimeMillis" : 0, // Waktu eksekusi
		"totalKeysExamined" : 0, // Berapa banyak indeks yang dipindai
		"totalDocsExamined" : 5, // Jumlah total dokumen yang dipindai
		"executionStages" : {
			"stage" : "COLLS CAN", // Tipe tahap, COLLSCAN berarti pemindaian seluruh tabel
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

Ide-ide Optimasi Kueri

  • Gunakan indeks sebanyak mungkin
  • Semakin sedikit dokumen yang dipindai, semakin baik