Sự kiện thu thập có userId và một mảng sự kiện-- mỗi phần tử trong mảng là tài liệu được nhúng. Ví dụ:mongodb - chỉ mục ngày không được sử dụng
{
"_id" : ObjectId("4f8f48cf5f0d23945a4068ca"),
"events" : [
{
"eventType" : "profile-updated",
"eventId" : "247266",
"eventDate" : ISODate("1938-04-27T23:05:51.451Z"),
},
{
"eventType" : "login",
"eventId" : "64531",
"eventDate" : ISODate("1948-05-15T23:11:37.413Z"),
}
],
"userId" : "junit-19568842",
}
Sử dụng một truy vấn như hình dưới đây tofind sự kiện được tạo ra trong 30 ngày qua:
db.events.find({ events : { $elemMatch: { "eventId" : 201,
"eventDate" : {$gt : new Date(1231657163876) } } } } ).explain()
kế hoạch truy vấn cho thấy chỉ số về "events.eventDate" được sử dụng khi dữ liệu thử nghiệm chứa ít sự kiện hơn (khoảng 20):
{
"cursor" : "BtreeCursor events.eventDate_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"events.eventDate" : [
[
ISODate("2009-01-11T06:59:23.876Z"),
ISODate("292278995-01--2147483647T07:12:56.808Z")
]
]
}
}
Tuy nhiên, khi có số lượng lớn các sự kiện (khoảng 500), chỉ số không được sử dụng:
{
"cursor" : "BasicCursor",
"nscanned" : 4,
"nscannedObjects" : 4,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
Tại sao chỉ số không được sử dụng khi có rất nhiều các sự kiện? Có thể là khi có số lượng lớn các sự kiện, MongoDB thấy hiệu quả chỉ là quét tất cả các mục so với sử dụng chỉ mục?
Bạn đang phàn nàn rằng trình tối ưu hóa không sử dụng chỉ mục trên truy vấn mất 0ms để trả lại? :) –
Đầu ra giải nghĩa ở trên là từ một bộ sưu tập thử nghiệm. Với khoảng 20 triệu tài liệu, truy vấn mất khoảng 8 giây. – dsatish
Các truy vấn phạm vi như vậy có thể chậm nếu bạn đang truy vấn một phần đáng kể tài liệu của bộ sưu tập. Bạn có thể sử dụng gợi ý để buộc chỉ mục so sánh tốc độ, nhưng tôi tưởng tượng nó sẽ chỉ làm chậm quá trình quét chỉ mục. Bạn nên đăng giải thích từ dữ liệu sản xuất của mình, có và không có gợi ý. Vấn đề là, nếu bạn đang tìm kiếm vài triệu tài liệu phù hợp, nó sẽ mất một thời gian để kiểm tra chúng. –