Gần đây chúng tôi đã đạt được hơn 2 triệu bản ghi cho một trong những bộ sưu tập chính của chúng tôi và bây giờ chúng tôi bắt đầu gặp vấn đề về hiệu suất lớn trên bộ sưu tập đó.
Các tài liệu trong bộ sưu tập có khoảng 8 trường mà bạn có thể lọc bằng cách sử dụng giao diện người dùng và kết quả phải được sắp xếp theo trường dấu thời gian mà bản ghi đã được xử lý.
Tôi đã thêm một số chỉ mục kết hợp với các trường được lọc và bộ đếm thời gian, ví dụ:
db.events.ensureIndex({somefield: 1, timestamp:-1})
Tôi cũng đã thêm một số chỉ mục để sử dụng một số bộ lọc cùng một lúc để hy vọng đạt được hiệu suất tốt hơn. Nhưng một số bộ lọc vẫn mất nhiều thời gian để thực hiện.
Tôi đã đảm bảo rằng sử dụng giải thích rằng các truy vấn sử dụng các chỉ mục tôi đã tạo nhưng hiệu suất vẫn không đủ tốt.
Tôi đã tự hỏi liệu sharding có phải là cách để đi ngay bây giờ hay không .. nhưng chúng tôi sẽ sớm bắt đầu có khoảng 1 triệu bản ghi mới mỗi ngày trong bộ sưu tập đó .. vì vậy tôi không chắc liệu nó có mở rộng quy mô tốt hay không ..
EDIT: ví dụ cho một truy vấn:
> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['nickey@acme.com']}}).sort({timestamp: -1}).limit(25).explain()
{
"cursor" : "BtreeCursor user.userName_1_timestamp_-1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 30060,
"nscanned" : 30060,
"nscannedObjectsAllPlans" : 120241,
"nscannedAllPlans" : 120241,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 26495,
"indexBounds" : {
"user.userName" : [
[
"nickey@acme.com",
"nickey@acme.com"
]
],
"timestamp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "yarin:27017"
}
xin lưu ý rằng deviceType chỉ có 2 giá trị trong bộ sưu tập của tôi.
limit
đối số?