Ответ 1
- Почему конвейерная обработка агрегации занимает столько памяти?
Просто выполнить $match
не нужно будет читать фактические данные, это можно сделать по индексам. Через доступ к проекции field1
, фактический документ должен быть прочитан, и он, вероятно, также будет кэшироваться.
Кроме того, группирование может быть дорогостоящим. Как правило, он должен сообщать об ошибке, если на этапе группировки требуется более 100 МБ памяти - какую версию вы используете? Это требует сканирования всего набора результатов перед уступкой, и MongoDB должен будет хотя бы хранить указатель или индекс каждого элемента в группах. Я полагаю, что основной причиной увеличения памяти является первая.
- Как мы можем увеличить нашу производительность, чтобы он работал в разумные сроки для HTTP-запроса?
Кажется, что ваш dtKey
кодирует время, и группировка также выполняется в зависимости от времени. Я попытаюсь воспользоваться этим фактом - например, путем предкоммутации агрегатов для каждого дня и комбинации our_id
- имеет большой смысл, если нет никаких критериев, и данные больше не меняются.
В противном случае я попытаюсь перенести критерий {"our_id":"111111111"}
в первую позицию, потому что равенство должно всегда предшествовать запросам диапазона. Я предполагаю, что оптимизатор запросов в структуре агрегации достаточно умен, но стоит попробовать. Кроме того, вы можете попытаться превратить ваши два индекса в один составной индекс { our_id, dtkey }
. Переходы индексов теперь поддерживаются, но я не уверен, насколько это эффективно. Используйте встроенный профиль и .explain()
для анализа вашего запроса.
Наконец, MongoDB предназначен для многопользовательской записи и сканирования наборов данных сотен ГБ с диска в миллисекундах, не представляется возможным вообще вычислить. Если ваш набор данных больше, чем ваша оперативная память, вы столкнетесь с большими задержками ввода-вывода в масштабе десятков миллисекунд и выше, десятки или сотни тысяч раз из-за всех необходимых операций с дисками. Помните, что при случайном доступе вы никогда не приблизитесь к теоретическим последовательным скоростям передачи диска. Если вы не можете прекомпетровать, я думаю, вам понадобится намного больше ОЗУ. Может быть, SSD-диски помогут, но это все догадки.