Запрос производительности MongoDB для более чем 5 миллионов записей
Недавно мы достигли> 2 миллионов записей для одной из наших основных коллекций, и теперь мы стали страдать из-за серьезных проблем с производительностью этой коллекции.
Эти документы в коллекции имеют около 8 полей, которые можно отфильтровать с помощью пользовательского интерфейса, и результаты должны быть отсортированы по полю отметки времени, в котором была обработана запись.
Я добавил несколько составных индексов с отфильтрованными полями и временной меткой, например:
db.events.ensureIndex({somefield: 1, timestamp:-1})
Я также добавил несколько индексов для использования нескольких фильтров одновременно, чтобы надеяться на более высокую производительность. Но некоторые фильтры все еще работают ужасно долго.
Я убедился, что с помощью объяснения, что запросы используют индексы, которые я создал, но производительность все еще недостаточно хороша.
Мне было интересно, подходит ли сейчас использование шардинга ... но скоро мы начнем иметь около 1 миллиона новых записей в день в этой коллекции ... поэтому я не уверен, будет ли она хорошо масштабироваться ...
РЕДАКТИРОВАТЬ: пример для запроса:
> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['[email protected]']}}).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,
"scanAnd,Order" : false,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 26495,
"indexBounds" : {
"user.userName" : [
[
"[email protected]",
"[email protected]"
]
],
"timestamp" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "yarin:27017"
}
пожалуйста, обратите внимание, что deviceType имеет только 2 значения в моей коллекции.