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