Недавно мы записали > 2 миллиона записей для одной из наших основных коллекций, и теперь мы начали страдать от серьезных проблем с производительностью в этой коллекции.
В документах в коллекции содержится около 8 полей, которые вы можете фильтровать с помощью пользовательского интерфейса, и результаты должны сортироваться по полю метки времени, в котором была обработана запись.
Я добавил несколько составных индексов с отфильтрованными полями и timetamp например:
db.events.ensureIndex({somefield: 1, timestamp:-1})
Я также добавил пару индексов для одновременного использования нескольких фильтров, чтобы, надеюсь, достичь лучшей производительности. Но некоторые фильтры по-прежнему занимают очень много времени.
Я убедился, что использование объясняет, что запросы используют индексы, которые я создал, но производительность по-прежнему недостаточно хороша.
Мне было интересно, может ли sharding поехать сейчас... но мы скоро начнем иметь около 1 миллиона новых записей в день в этой коллекции. Поэтому я не уверен, что он будет хорошо масштабироваться.
EDIT: пример для запроса:
> 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,
"scanAndOrder" : 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 значения.