วิเคราะห์แผนการดำเนินการคิวรีด้วย explain()
เมธอด explain() ให้ข้อมูลรายละเอียดเกี่ยวกับวิธีที่ MongoDB ดำเนินการคิวรี รวมถึงการใช้ดัชนี จำนวนเอกสารที่สแกน และแผนการทำงานที่เลือก
ตัวอย่างข้อมูลและสร้างดัชนี
> db.demo408.insertOne({ "Value": 50 });
> db.demo408.insertOne({ "Value": 20 });
> db.demo408.insertOne({ "Value": 45 });
> db.demo408.insertOne({ "Value": 35 });
> db.demo408.createIndex({ Value: 1 });
แสดงข้อมูลทั้งหมด
> db.demo408.find();
คำสั่งดู Query Plan สำหรับคิวรี Value > 40
> db.demo408.explain().find({ Value: { $gt: 40 } });
ผลลัพธ์ Query Plan (สำคัญ)
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "test.demo408",
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "Value": 1 },
"indexName": "Value_1",
"isMultiKey": false,
"direction": "forward",
"indexBounds": { "Value": ["(40.0, inf.0]"] }
}
},
"rejectedPlans": []
},
"serverInfo": { ... },
"ok": 1
}
ส่วนสำคัญใน Query Plan
- winningPlan.stage: "FETCH": ดึงเอกสารหลังจากสแกนดัชนี
- inputStage.stage: "IXSCAN": ใช้ Index Scan (ดี) ไม่ใช่ COLLSCAN (Collection Scan)
- indexName: "Value_1": ชื่อดัชนีที่ใช้
- indexBounds: ช่วงค่าที่ดัชนีสแกน (ในที่นี้คือ > 40)
- rejectedPlans: []: ไม่มีแผนอื่นที่ถูกพิจารณา
โหมด explain อื่นๆ
explain("queryPlanner"): แผนการที่จะใช้ (default)explain("executionStats"): รวมสถิติการทำงานจริง (nReturned, executionTimeMillis, totalKeysExamined, totalDocsExamined)explain("allPlansExecution"): รายละเอียดทุกแผนที่ถูกพิจารณา
ตัวชี้วัดประสิทธิภาพสำคัญ
- totalKeysExamined: จำนวนคีย์ดัชนีที่อ่าน
- totalDocsExamined: จำนวนเอกสารที่อ่าน
- executionTimeMillis: เวลาที่ใช้ (ms)
- อุดมคติ: totalDocsExamined ≈ nReturned แสดงว่าคิวรีมีประสิทธิภาพ