บทนี้เป็นการแนะนำเกี่ยวกับการวิเคราะห์ประสิทธิภาพของคิวรี 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
}
}
}
ไอเดียในการปรับปรุงคิวรี
- ใช้ดัชนีให้มากที่สุดเท่าที่เป็นไปได้
- จำนวนเอกสารที่สแกนได้น้อยลงยิ่งดี