วิเคราะห์ Query Plan ใน MongoDB ด้วย explain()
บทความนี้สาธิตการใช้คำสั่ง explain() ใน MongoDB เพื่อดูแผนการประมวลผลคิวรี่ (Query Execution Plan) ซึ่งช่วยในการวิเคราะห์ประสิทธิภาพและการใช้ดัชนี (Index)
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo202 และเพิ่มเอกสาร 3 รายการ
> db.demo202.insertOne({"StudentFirstName":"Chris","StudentAge":21});
{ "acknowledged": true, "insertedId": ObjectId("5e3c3bd103d395bdc21346e8") }
> db.demo202.insertOne({"StudentFirstName":"David","StudentAge":23});
{ "acknowledged": true, "insertedId": ObjectId("5e3c3bd803d395bdc21346e9") }
> db.demo202.insertOne({"StudentFirstName":"Bob","StudentAge":22});
{ "acknowledged": true, "insertedId": ObjectId("5e3c3bde03d395bdc21346ea") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo202.find();
ผลลัพธ์:
{ "_id": ObjectId("5e3c3bd103d395bdc21346e8"), "StudentFirstName": "Chris", "StudentAge": 21 }
{ "_id": ObjectId("5e3c3bd803d395bdc21346e9"), "StudentFirstName": "David", "StudentAge": 23 }
{ "_id": ObjectId("5e3c3bde03d395bdc21346ea"), "StudentFirstName": "Bob", "StudentAge": 22 }
ขั้นตอนที่ 3: ใช้ explain() เพื่อดู Query Plan
รันคิวรี่ค้นหา StudentFirstName: "David" พร้อม explain()
> db.demo202.find({"StudentFirstName":"David"}).explain();
ผลลัพธ์ Query Plan (สรุปสำคัญ)
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "test.demo202",
"indexFilterSet": false,
"parsedQuery": {
"StudentFirstName": { "$eq": "David" }
},
"winningPlan": {
"stage": "COLLSCAN",
"filter": { "StudentFirstName": { "$eq": "David" } },
"direction": "forward"
},
"rejectedPlans": []
},
"serverInfo": {
"host": "DESKTOP-QN2RB3H",
"port": 270017,
"version": "4.0.5"
},
"ok": 1
}
การอธิบาย:
- stage: "COLLSCAN" - หมายถึงการสแกนทั้ง Collection (Collection Scan) เพราะไม่มีดัชนีสำหรับฟิลด์
StudentFirstName - filter - เงื่อนไขที่ใช้กรองข้อมูล
- rejectedPlans: [] - ไม่มีแผนอื่นที่ถูกพิจารณา
คำแนะนำ: หากคิวรี่นี้รันบ่อย ควรสร้างดัชนี (Index) บนฟิลด์ StudentFirstName เพื่อเปลี่ยนจาก COLLSCAN เป็น IXSCAN (Index Scan) ซึ่งจะเร็วกว่ามาก