MongoDB 'count ()' очень медленный.Как мы можем улучшить / обойти это? - PullRequest
54 голосов
/ 05 октября 2011

В настоящее время я использую MongoDB с миллионами записей данных. Я обнаружил одну вещь, которая довольно раздражает.

Когда я использую функцию count () с небольшим количеством запрашиваемых данных, это очень быстро. Однако, когда запрошенный сбор данных содержит тысячи или даже миллионы записей данных, вся система становится очень медленной.

Я убедился, что проиндексировал обязательные поля.

Кто-нибудь сталкивался с такой же вещью? Как вы можете улучшить это?

Ответы [ 4 ]

31 голосов
/ 05 октября 2011

Теперь существует другая оптимизация, кроме создания правильного индекса.

db.users.ensureIndex({name:1});
db.users.find({name:"Andrei"}).count();

Если вам нужны счетчики, я советую их пересчитать, когда это возможно. Используя атомарную $ inc операцию и не используйте count({}) вообще.

Но ребята из mongodb усердно работают над mongodb, поэтому count({}) улучшений, которые они планируют в mongodb 2.1 в соответствии с jira bug .

10 голосов
/ 05 октября 2011

Вы можете убедиться, что индекс действительно используется без доступа к диску.

Допустим, вы хотите посчитать записи с именем: "Андрей"

Вы гарантируете индекс по имени (как вы сделали) и

db.users.find({name:"andrei"}, {_id:0, name:1}).count()

вы можете проверитьчто это самый быстрый способ подсчета (за исключением предварительной обработки), проверяя, отображает ли

db.users.find({name:"andrei"}, {_id:0, name:1}).explain() 

поле index_only, установленное в значение true.

Этот трюк гарантирует, что ваш запрос будет получать только записииз оперативной памяти (индекса), а не с диска.

6 голосов
/ 22 сентября 2015

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

db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } )

db.Account.find({    
     "dateChecked" : { $exists : true }    
}).count()

318 тысяч записей в коллекции

  • 0,31 сек - с разреженным индексом
  • 0,79 с - с разреженным индексом
5 голосов
/ 20 августа 2012

Вам пока не повезло, счет в mongodb ужасен и в ближайшее время не станет лучше.См .: https://jira.mongodb.org/browse/SERVER-1752

По опыту, вы почти никогда не должны использовать его, если это не разовая вещь, то, что происходит очень редко, или ваша база данных довольно мала.

Как сказал @Andrew Orsich, используйте счетчики всякий раз, когда это возможно (падение счетчиков - это глобальная блокировка записи, но лучше, чем count () независимо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...