Câu trả lời: CÓ
MongoDB hoàn toàn có thể sử dụng index khi truy vấn chứa toán tử $or. Mỗi điều kiện trong mảng $or có thể sử dụng index riêng biệt, và MongoDB sẽ hợp nhất kết quả thông qua chiến lược OR trong query planner.
Ví dụ minh họa
1. Tạo các index
> db.indexOrQueryDemo.ensureIndex({"First":1});
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
> db.indexOrQueryDemo.ensureIndex({"Second":1});
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 3, "numIndexesAfter" : 4, "ok" : 1 }
2. Thực hiện truy vấn $or với explain()
> db.indexOrQueryDemo.find({$or:[{First:1}, {Second:2}]}).explain();
3. Phân tích execution plan (winningPlan)
Kết quả explain() cho thấy MongoDB sử dụng chiến lược SUBPLAN với stage OR kết hợp hai IXSCAN (index scan):
- IXSCAN trên index
First_1cho điều kiệnFirst: 1 - IXSCAN trên index
Second_1cho điều kiệnSecond: 2
Các lưu ý quan trọng
- Mỗi mệnh đề trong
$ornên có index riêng để tối ưu hiệu suất - MongoDB 2.6+ hỗ trợ index intersection cho $or
- Sử dụng
explain("executionStats")để xem chi tiết số lượng document examined - Tránh dùng $or với quá nhiều điều kiện (hạn chế ~100 điều kiện)
Cú pháp tạo index hiện đại
// Thay vì ensureIndex (deprecated)
db.collection.createIndex({ "First": 1 });
db.collection.createIndex({ "Second": 1 });