Để phân tích hiệu suất truy vấn MongoDB, bạn sử dụng phương thức explain() trước find() hoặc aggregate(). Nó trả về **Query Plan** chi tiết: index được dùng (IXSCAN) hay quét toàn bộ (COLLSCAN), số bản ghi duyệt, index bounds, v.v. - cực quan trọng cho tuning.
1. Tạo bộ sưu tập, chèn dữ liệu và tạo index
> 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 }); // Index tăng dần trên Value
2. Xem dữ liệu
> db.demo408.find();
3. Phân tích Query Plan cho truy vấn Value > 40
> db.demo408.explain().find({ Value: { $gt: 40 } });
4. Phân tích kết quả quan trọng (winningPlan)
{
"queryPlanner": {
"winningPlan": {
"stage": "FETCH", // Lấy tài liệu sau khi có con trỏ index
"inputStage": {
"stage": "IXSCAN", // QUAN TRỌNG: Dùng Index Scan (tốt)
"keyPattern": { "Value": 1 }, // Index dùng
"indexName": "Value_1",
"indexBounds": {
"Value": [ "(40.0, inf.0]" ] // Phạm vi index sử dụng
}
}
},
"rejectedPlans": [] // Không có plan bị loại
},
"ok": 1
}
Các Stage quan trọng cần nhận diện:
- COLLSCAN: Collection Scan (Quét toàn bộ) -> **CHẬM**, cần tạo index.
- IXSCAN: Index Scan -> **Nhanh**, index đang được dùng.
- FETCH: Lấy tài liệu đầy đủ sau khi index trỏ đến.
- SORT: Sắp xếp trong bộ nhớ (nếu không có index hỗ trợ sort).
- PROJECTION: Chiếu trường (covered query nếu chỉ lấy trường trong index).
Chế độ explain: explain("executionStats") (thực thi thật, có thời gian, số docs examined), explain("allPlansExecution") (chi tiết tất cả plan).