Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Có thể truy vấn index MongoDB khi query chứa toán tử $or không?

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_1 cho điều kiện First: 1
  • IXSCAN trên index Second_1 cho điều kiện Second: 2

Các lưu ý quan trọng

  • Mỗi mệnh đề trong $or nê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 });