Thêm một chút nữa vào baloo câu trả lời của.
Về vấn đề thời gian so với dài hạn. Nói chung máy chủ MongoDB sẽ không thấy sự khác biệt. Độ dài mã hóa BSON là như nhau (64 bit). Bạn có thể thấy hiệu suất khác nhau ở phía máy khách tùy thuộc vào mã hóa của trình điều khiển. Ví dụ:về phía Java, sử dụng trình điều khiển 10gen một dấu thời gian được hiển thị dưới dạng Date
nặng hơn nhiều so với Long
. Có trình điều khiển
cố gắng tránh chi phí đó.
Vấn đề khác là bạn sẽ thấy sự cải thiện hiệu suất nếu bạn đóng phạm vi cho trường đầu tiên của chỉ mục. Vì vậy, nếu bạn sử dụng chỉ mục do baloo đề xuất :
db.collection.ensureIndex({start: 1, final: 1})
Truy vấn của bạn sẽ hoạt động (có khả năng tốt hơn nhiều) nếu bạn truy vấn là:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
Về mặt khái niệm, nếu bạn coi các chỉ mục như một cây thì phạm vi đóng sẽ giới hạn cả hai phía của cây thay vì chỉ một phía. Nếu không có phạm vi đóng, máy chủ phải "kiểm tra" tất cả các mục nhập bằng start
lớn hơn dấu thời gian được cung cấp vì nó không biết mối quan hệ giữa start
và final
.
Bạn thậm chí có thể thấy rằng hiệu suất truy vấn không tốt hơn bằng cách sử dụng một chỉ mục trường đơn lẻ như:
db.collection.ensureIndex({start: 1})
Phần lớn số tiền tiết kiệm được là từ việc cắt tỉa cánh đồng đầu tiên. Trường hợp sẽ không xảy ra là khi truy vấn được bao phủ bởi chỉ mục hoặc thứ tự / sắp xếp cho các kết quả có thể được bắt nguồn từ chỉ mục.
HTH - Rob.