Мы недавно написали> 2 миллиона записей для одной из наших основных коллекций, и теперь мы начали страдать от серьезных проблем с производительностью в этой коллекции.Производительность MongoDB для более 5 миллионов записей
Эти документы в коллекции содержат около 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 имеет только два значения в моей коллекции.
Используете ли вы аргумент 'limit'? – Joe
хороший! Вероятно, у меня будет подобный сценарий в будущем, и ответы могут быть полезны и мне. Насколько велика ваша база данных с такой коллекцией? Сколько времени потребовалось, прежде чем запрашивать эти пары с 8 КВ, прежде чем вы достигнете 2 мили и сколько времени это займет сейчас? (просто любопытно) – anvarik
Джо, да, конечно, я использую лимиты, на данный момент я ограничиваю свои результаты 25 документами. Я даже не хочу говорить о пропуске, так как я собираюсь заменить их запросами диапазона в ближайшем будущем. –