Почему MongoDB find имеет такую ​​же производительность, как и count - PullRequest
0 голосов
/ 23 октября 2018

Я запускаю тесты на моем MongoDB и по какой-то причине find имеет ту же производительность, что и count.

Статистика: размер коллекции заказов: ~ 20M, заказы с product_id 6: ~ 5K

product_id индексируется для повышения производительности.

Запрос: db.orders.find({product_id: 6}) против db.orders.find({product_id: 6}).count()

результат заказов для продукта против 5K после 0,08 мс

Почемусчитать не значительно быстрее?он может найти первую и последнюю позицию элементов с помощью индекса product_id

1 Ответ

0 голосов
/ 23 октября 2018

Как указано в документации Mongo для подсчета , вызов count аналогичен вызову find, но вместо возврата документов он просто считает их.Чтобы выполнить этот подсчет, он перебирает курсор.Он не может просто прочитать индекс и определить количество документов на основе первого и последнего значения некоторого идентификатора, тем более что у вас может быть индекс для какого-то другого поля, которое не является идентификатором (и идентификаторы Монго не являются автоматически увеличивающимися).Таким образом, в основном find и count - это одна и та же операция, но вместо получения документов она просто просматривает их, суммирует их число и возвращает его вам.

Кроме того, если вы хотите получить более быстрый результат, вы можете использовать estimatedDocumentsCount ( docs ), которые будут идти прямо к метаданным коллекции.Это приводит к потере возможности спросить «Какое количество документов я могу ожидать, если я инициирую этот запрос?».Если вам нужно быстрее найти количество документов для запроса, то вы можете использовать countDocuments ( docs ), который является оболочкой для агрегированного запроса.Насколько мне известно о Mongo, предоставленный запрос выглядит как самый быстрый способ подсчета результатов запроса без вызова count.Я полагаю, что это предпочтительный способ в отношении производительности для подсчета документов с этого момента (так как он появился в версии 4.0.3).

...