บทนี้เป็นการแนะนำเกี่ยวกับการวิเคราะห์ประสิทธิภาพของคิวรี MongoDB ที่เป็นคล้ายกับการใช้ explain ของ SQL MongoDB ยังรองรับ explain ในการวิเคราะห์ประสิทธิภาพของคำสั่งคิวรีเช่นกัน

การใช้งานพื้นฐาน

โดยการเรียกใช้ฟังก์ชัน explain คุณสามารถได้รับผลวิเคราะห์ได้ดังนี้

// ผลการวิเคราะห์ของเมทอด find
db.collection.find({}).explain();

// ผลการวิเคราะห์ของเมทอด aggregate
db.collection.explain().aggregate([]);

explain มีทั้งหมด 3 โหมด:

  • queryPlanner (ค่าเริ่มต้น)
  • executionStats
  • allPlansExecution

คำอธิบาย:

  • การใช้ queryPlanner เพียงแค่รายการทุกแผนการดำเนินงานที่เป็นไปได้ โดยไม่สามารถดำเนินการคำสั่งแบบจริง และแสดงแผนที่ชนะแล้ว
  • การใช้ executionStats ดำเนินการแค่แผนที่ชนะและแสดงผลลัพธ์
  • การใช้ allPlansExecution ดำเนินการทุกแผนและแสดงผลลัพธ์

การใช้โหมดที่แตกต่างกัน

// โหมด executionStats โดยง่ายเพียงแค่ส่งพารามิเตอร์ไปยังฟังก์ชัน explain
db.collection.find({}).explain('executionStats');

// โหมด allPlansExecution
db.collection.find({}).explain('allPlansExecution');

คำอธิบายเนื้อหาของ explain

เนื้อหา queryPlanner

เนื้อหาต่อไปนี้เป็นเนื้อหาค่าเริ่มต้นที่ถูกส่งคืนโดย explain โดยละเว้นข้อมูลที่ไม่ใช่สำคัญ

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // ตัววัดสำคัญ ว่ามีการใช้การกรองด้วยดัชนีหรือไม่
		"winningPlan" : {
			"stage" : "COLLSCAN",  // ตัววัดสำคัญ ชื่อของขั้นตอนแต่ละขั้นต้องมีข้อมูลแตกต่างกัน เช่น COLLSCAN แทนการสแกนเนื้อหาคอลเล็คชั่นทั้งหมด
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

ประเภทขั้นตอนขั้นต่าง ๆ คือ:

  • COLLSCAN: การสแกนตารางทั้งหมด
  • IXSCAN: การสแกนดัชนี
  • FETCH: ดึงเอกสารที่เฉพาะเจาะจงโดยใช้ดัชนี
  • SHARD_MERGE: การผสานข้อมูลที่ส่งคืนโดยแต่ละชาร์ด
  • SORT: ระบุการเรียงลำดับในหน่วยความจำ
  • LIMIT: จำกัดจำนวนการส่งออก
  • SKIP: ข้ามการใช้
  • IDHACK: คิวรีสำหรับ _id
  • SHARDING_FILTER: คิวรีข้อมูลที่แชร์ผ่าน mongos
  • COUNT: ดำเนินการนับโดยใช้ db.coll.explain().count() หรือเหมือนกับ
  • COUNTSCAN: ขั้นตอนที่ส่งคืนเมื่อนับโดยไม่ใช้ดัชนีเพื่อการนับ
  • COUNT_SCAN: ขั้นตอนที่ส่งคืนเมื่อนับโดยใช้ดัชนีเพื่อการนับ
  • SUBPLA: ขั้นตอนที่ส่งคืนสำหรับคิวรี $or ที่ไม่ใช้ดัชนี
  • TEXT: ขั้นตอนที่ส่งคืนเมื่อคิวรีโดยใช้ดัชนีข้อความเต็ม
  • PROJECTION: ขั้นตอนที่ส่งคืนสำหรับการจำกัดฟิลด์ที่ส่งคืน

เนื้อหา executionStats

เนื้อหาต่อไปนี้คือเนื้อหาที่ส่งคืนในโหมด executionStats โดยละเว้นข้อมูลที่ไม่ใช่สำคัญ

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // จำนวนเอกสารที่ส่งคืน
		"executionTimeMillis" : 0, // เวลาการดำเนินการ
		"totalKeysExamined" : 0, // จำนวนดัชนีที่สแกน
		"totalDocsExamined" : 5, // จำนวนทั้งหมดของเอกสารที่สแกน
		"executionStages" : {
			"stage" : "COLLS CAN", // ประเภทขั้นตอน COLLSCAN หมายถึงการสแกนตารางทั้งหมด
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

ไอเดียในการปรับปรุงคิวรี

  • ใช้ดัชนีให้มากที่สุดเท่าที่เป็นไปได้
  • จำนวนเอกสารที่สแกนได้น้อยลงยิ่งดี