#performance #mongodb #indexing #aggregation-framework
#Производительность #mongodb #индексирование #aggregate-framework
Вопрос:
У меня есть две дублированные коллекции с точно такой же информацией.
Свойства MongoDB: — Версия 2.6 — Виртуальная машина с 4-ядерным процессором и 8 ГБ оперативной памяти
Свойства коллекции: — около 2.200.000 документов — 10 ГБ на коллекцию
Чтобы извлечь из этого некоторую информацию, я использую aggregation framework. Это работает очень хорошо, но занимает около 70 секунд.
db.coll.aggregate( [{
$group: {
_id: {
OWNER: "$OWNER",
CATEGORY__: "$CATEGORY__"
},
VALUE: { $sum: "$VALUE" }
}
}])
Поэтому я реализую индекс для владельца и категории….
Если я выполняю тот же запрос, это занимает около 150 секунд!
Кто-нибудь знает причину этих противоречивых результатов?
Дополнительно: только включив $match, я могу увеличить производительность. (25 сек)
Комментарии:
1. Вы запускали их последовательно, не так ли. Вы понимаете, что в вашем последнем усилии, которое сбросило индекс, вам пришлось удалить все индексные страницы из памяти, поскольку они были недействительны для вашей последней операции, и данные нужно было снова перезагрузить с диска. Ваше тестирование на самом деле недействительно. Вам нужно снова и снова выполнять одни и те же запросы там, где вы ожидаете, что данные будут «горячими» и загруженными для достижения наилучшей производительности.
2. Что ж, спасибо за ваш совет. После внедрения индекса я запустил первый запрос примерно 10 раз подряд … поэтому загрузка данных должна быть «горячей».
3. Я хотел сказать, что вы должны увидеть согласованные результаты с вашим первым образцом по тому же запросу. Но на самом деле, вы должны не только использовать индекс, используя начальный
$match
, но и фильтровать результаты, идущие в дальнейшие операции. Конечный результат должен быть быстрее, поэтому я не уверен, действительно ли здесь есть вопрос. Есть ли?4. Основная проблема заключается не в
$match
… это разница между первым оператором с индексами и без. Я знаю, что индекс не работает с $ group. Тем не менее, я выполняю один и тот же запрос к первой коллекции без индексов и второй коллекции с индексом … но я подумал, что это будет еще лучше или, возможно, то же самое с индексом. Я совершенно не прав? Потому что это было бы отрицательно, если бы индекс снижал производительность некоторых запросов.5. Возможно, вам следует отредактировать свой вопрос, чтобы включить более подробную информацию о том, что вы пытаетесь сказать. В примерах показано
$match
, что использование индекса значительно сокращает время, в то время как другие ваши операции, которые не могут использовать индекс, выполняются медленнее. Я действительно только пытался подтолкнуть вас к четкой точке зрения или рассмотреть проблемы в вашей оценке.