MongoDB запрос подсчета зависания на коллекции с большими объектами - PullRequest
0 голосов
/ 05 марта 2020

У меня есть коллекция из 10.000 предметов. Размер каждого объекта составляет около 500 КБ, поскольку они включают в себя изображения. Для статистики мне нужно посчитать объекты по времени их создания. Хотя у меня есть индексы, подсчет всей коллекции занимает более 15 секунд. Когда я удаляю поле image (т. Е. Объект становится простым JSON объектом), запрос немедленно возвращается. Я не понимаю, почему размер объектов так сильно влияет на производительность. Вот пример запроса, который я использовал:

const aggregation = [
   {"$match": {"createTime": {"$gte": "2019-01-01T00:00:00.000Z"}}},
   {"$match": {"createTime": {"$lte": "2020-01-01T23:59:59.999Z"}}},
   {"$count": "value"}];
myCollection.aggregate(aggregation).then(foo);

Есть ли способ сделать запрос быстрее?

Одним из решений, которое я мог бы придумать, является хранение изображений в отдельной коллекции. Это, безусловно, ускорит запрос, но мне интересно, что вызвало снижение производительности.

1 Ответ

1 голос
/ 05 марта 2020

500 КБ * 10000 документов - 5,1 ГБ для изучения. Это может занять несколько секунд, особенно если ваш кэш меньше этого.

Попробуйте вместо этого выполнить запрос count.

Предполагая, что на createTime есть индекс, и ни один документ в коллекции не содержит массив для этого поля (т. е. индекс не является мультиключевым), этот запрос должен быть полностью покрыт.

Это означает, что исполнитель запроса должен использовать этап COUNTSCAN, чтобы найти число совпадающих документов путем сканирования индекса, и никогда не должен просматривать один документ, что означает, что размер документа больше не имеет значения, и это должно Сократите ваш дисковый ввод-вывод, отток кэша и загрузку процессора.

db.myCollection.count({"createTime": {"$gte": "2019-01-01T00:00:00.000Z"},"createTime": {"$lte": "2020-01-01T23:59:59.999Z"}})`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...