Нещодавно ми досягли> 2 мільйонів рекордів для однієї з наших основних колекцій, і тепер ми почали страждати через серйозні проблеми з продуктивністю цієї колекції.
Ці документи у колекції містять близько 8 полів, які можна відфільтрувати за допомогою інтерфейсу користувача, а результати передбачається відсортувати за полем мітки часу, в якому був оброблений запис.
Я додав кілька складених індексів із відфільтрованими полями та позначкою часу, наприклад:
db.events.ensureIndex({somefield: 1, timestamp:-1})
Я також додав пару індексів для використання декількох фільтрів одночасно, щоб, сподіваємось, досягти кращої продуктивності. Але деякі фільтри все ще займають жахливо багато часу.
Я переконався, що використовуючи пояснення, що запити використовують індекси, які я створив, але продуктивність все ще недостатньо хороша.
Мені було цікаво, чи варто зараз робити шардінг .. але незабаром ми почнемо мати в цій колекції близько 1 мільйона нових записів на день .. так що я не впевнений, що це буде добре масштабуватися ..
EDIT: приклад запиту:
> 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"
}
Зверніть увагу, що deviceType має лише 2 значення в моїй колекції.
limit
аргумент?