MongoDB {агрегация $match} vs {найти} скорость
у меня есть коллекция mongoDB с миллионами строк, и я пытаюсь оптимизировать свои запросы. В настоящее время я использую структуру агрегации для извлечения данных и группировки их по своему усмотрению. Мой типичный запрос агрегации-это что-то вроде : $match > $group > $ group > $project
однако я заметил, что последние части занимают всего несколько МС, начало самое медленное.
Я попытался выполнить запрос только с фильтром $match, а затем выполнить тот же запрос с коллекцией.находить. Этот запрос агрегации занимает ~80 мс, в то время как запрос поиска занимает 0 или 1 мс.
у меня есть индексы практически на каждом поле, поэтому я думаю, что это не проблема. Есть идеи, что может пойти не так ? Или это просто "нормальный" недостаток структуры агрегации ?
я мог бы использовать запросы поиска вместо запросов агрегации, однако мне пришлось бы выполнить много обработки после запроса, и этот процесс можно сделать быстро с $group
etc. поэтому я предпочел бы сохранить агрегацию рамки.
спасибо,
EDIT:
вот мои критерии :
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
2 ответов
основная цель aggregation framework
, чтобы облегчить запрос большого количества записей и генерировать небольшое количество результатов, которые содержат значение для вас.
как вы сказали, вы также можете использовать несколько find
запросы, но помните, что вы не можете создавать новые поля с find
запросы. С другой стороны,$group
stage позволяет определить новые поля.
если вы хотите достичь функциональности aggregation framework
, вы, скорее всего, придется запустить инициал find
(или цепочка из нескольких), вытащите эту информацию и дальше манипулируйте ею с помощью языка программирования.
The aggregation pipeline
может показаться, что займет больше времени, но, по крайней мере, вы знаете, что вам нужно учитывать только производительность одной системы - MongoDB engine.
тогда как, когда дело доходит до манипулирования данными, возвращенными из find
запрос, вам, скорее всего, придется дополнительно манипулировать данными с помощью языка программирования, тем самым увеличивая сложность в зависимости от сложности выбора языка программирования.
вы пробовали использовать explain () для поиска запросов? Это даст вам хорошее представление о том, сколько времени займет запрос find (). Вы можете сделать то же самое для $match с $explain и посмотреть, есть ли разница в доступе к индексу и другим параметрам.
также $group часть aggregation framework не использует индексацию, поэтому она должна обрабатывать все записи, возвращаемые $ match stage aggregation framework. Чтобы лучше понять работу вашим запросом см. результирующий набор, который он возвращает , и вписывается ли он в память для обработки MongoDB.