Если я делаю счета запрос, получить результаты в < 2secondsПонимание производительности: Монго агрегацию против подсчета
db.coll.find({"A":1,"createDate":{"$gt":new Date("2011-05-21"),"$lt":new Date("2013-08-21")}}).count()
При этом используется следующий индекс
db.coll.ensureIndex({"A":1,"createDate":1})
Кроме того, есть 4 колонки А , B, C, D (значения всегда равны 0 или 1), для которых я запускаю 4 счета запросов и получаю результаты в < 10 секунд.
Я просмотрел документацию по агрегационной структуре и создал агрегированный запрос для выполнения всех четырех сумм.
db.coll.aggregate( { $match : {"createDate":{$gt:new Date("2013-05-21"),$lt:new Date("2013-08-21")} } },
{ $group :
{ _id:null,
totalA : { $sum : "$A" },
totalB : {$sum: "$B},
totalC:{$sum: "$C"},
totalD:{$sum: "$D"}}}
)
Я также создал индекс:
db.coll..ensureIndex({"createDate":1,"A":1,"B":1,"C":1,"D":1})
Согласно документации, этот показатель охватывает мою агрегатную функцию. Но возврат агрегата составляет ~ 18 секунд.
Я здесь смущен. Есть ли что-то основное, что я пропустил, или есть фундаментальная концепция, лежащая позади, которая делает агрегацию медленнее, чем считать. Я также обеспокоен накладными расходами из-за количества запросов, которые будут уволены из монго из кода для подсчета количества.
объяснение для агрегации, просто добавьте аргумент {explain: true} после массива конвейера. И вся коллекция не должна передаваться, если есть индекс, который может предоставить необходимые значения. Проблема здесь заключается в том, что агрегация выполняет нечто иное, чем counts, это фактически добавляет значения этих полей, не считая, сколько из них отличных от нуля. –
Он еще не выпущен, но идет в 2.6. –
неправильный, он доступен в текущей версии 2.4.x и уже несколько месяцев. –