Может выполнить этот запрос через SQL менее чем за 1 секунду, но агрегатный MongoDB не может быть выполнен менее чем за 45 минут из того же набора данных с теми же индексами - PullRequest
0 голосов
/ 26 августа 2018

У меня есть набор данных (11 миллионов строк), который состоит из платежей, сделанных компаниям, структурированных так:

id : 12345678,
company_id : 123456,
payment_value : 50,
payer_id: 111111,
payment_date: "20/01/2017"
payer_name: "John Smith",
...<70ish more columns with mostly blank data>...

Есть 600k company_ids, и я хочу сгруппировать их и показать company_id с наибольшим общим количествомзначение платежа

Это код Mongo Shell (версия БД: 4.0.1), который у меня есть:

db.pay.aggregate([
 {$project: {_id:1, company_id:1, payment_value:1}},
 {$group: {_id: "$company_id", total_value: {$sum: "$payment_value"}}},
 {$sort: {total_value: -1},
 {$limit: 1}],
 {allowDiskUse: true})

Это не выполняется менее чем за 45 минут!У меня есть индекс для company_id, и это похоже на прямой запрос

Я загрузил его в PostgresDB и написал:

SELECT 
company_id,
SUM(payment_value)
FROM payments
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1

И это заняло <1 секунду.Я использую ту же методологию индекса для коллекции MongoDB и таблицы Postgres </p>

Что я здесь не так делаю с MongoDB?

Спасибо за ваше время

1 Ответ

0 голосов
/ 30 августа 2018

Мне удалось несколько улучшить производительность:

  • Изменить ограничения для доступных ресурсов для MongoDB, установив ulimits и rlimits в терминале -Use allowDishUse: true в конце агрегатных запросов
...