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.