Để xem thông tin kế hoạch thực thi truy vấn (query plan), sử dụng phương thức explain() sau find().
Tạo collection và index
> db.demo637.ensureIndex({ClientName: 1});
> db.demo637.insert({ClientName:"John"});
> db.demo637.insert({ClientName:"Bob"});
> db.demo637.insert({ClientName:"Johnson"});
Hiển thị dữ liệu
> db.demo637.find();
Kết quả: 3 document với ClientName: John, Bob, Johnson
Case 1: Regex không có anchor (/john/)
> db.demo637.find({ClientName: /john/}).explain();
Kết quả explain (rút gọn):
{
"queryPlanner": {
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"filter": { "ClientName": { "$regex": "john" } },
"keyPattern": { "ClientName": 1 },
"indexName": "ClientName_1",
"indexBounds": {
"ClientName": [ "[\"\", {})", "[/john/, /john/]" ]
}
}
}
}
}
Phân tích: Dùng index (IXSCAN) nhưng có **filter** vì regex không có anchor đầu (^)
Case 2: Regex có anchor đầu (/^john/)
> db.demo637.find({ClientName: /^john/}).explain();
Kết quả explain (rút gọn):
{
"queryPlanner": {
"winningPlan": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": { "ClientName": 1 },
"indexName": "ClientName_1",
"indexBounds": {
"ClientName": [ "[\"john\", \"joho\")", "[/^john/, /^john/]" ]
}
}
}
}
}
Phân tích: Dùng index (IXSCAN) **không có filter** - index bounds chính xác ["john", "joho") nhờ anchor ^
So sánh hiệu năng
| Regex | Sử dụng Index | Filter | Hiệu năng |
|---|---|---|---|
| /john/ | Có (IXSCAN) | Có | Chậm hơn - quét range rộng |
| /^john/ | Có (IXSCAN) | Không | Nhanh - seek chính xác |
Kết luận: Luôn dùng anchor ^ cho regex prefix search để tận dụng index tối đa. explain() giúp xác nhận index có được dùng hiệu quả không.