2014-09-08 2 views
1

Я пытаюсь найти время, необходимое для выполнения счета() на коллекции, которая, состоящая из миллионов Testdata записей, с следующим сценарием: -MongoDB: найти время выполнения команды count() для миллионов записей в коллекции?

1) С 1 Монго оболочкой Я вставив миллионы записей в коллекцию используя код

for (var i = 0; i < 10000000; ++i){ 
    db.unicorns.insert({name: 'sampleName', gender: 'm', weight: '440' }); 
} 

2) от 2ndMongo оболочки Я пытаюсь найти количество() на этой коллекции (Imp: во время вставки по-прежнему получать казнили на 1 Монго Shell)

db.unicorns.count() 

Я исследовал, но обнаружил, что explain() и stats() не могут применяться к команде count().

некоторые

Мне нужно, чтобы выяснить, сколько времени требуется, чтобы рассчитывать(), когда есть вставки собирается на коллекции (что-то вроде живого сценария)?

Есть ли другой хороший подход для этого?

ответ

6

MongoDB имеет встроенный profiller, что можно включить с помощью:

db.setProfilingLevel(2) 

Вместо '2' вы можете выбрать любой вариант из списка ниже:

  • - профилировщик отключен, не собирает никаких данных. mongod всегда записывает операции дольше, чем порог slowOpThresholdMs в свой журнал.
  • - собирает данные профилирования только для медленных операций. По умолчанию медленные операции медленнее, чем 100 миллисекунд. Вы можете изменить пороговое значение для «медленных» операций с помощью параметра runOpThresholdMs runtime или команды setParameter. Дополнительную информацию см. В разделе «Укажите пороговое значение для медленных операций».
  • - собирает данные профилирования для всех операций с базой данных.

И вы можете увидеть результаты ваших запросов, проверяя system.profile коллекции в MongoDB ..

EDIT:

Если вы хотите, чтобы проверить производительность можно использовать следующие фрагменты кода, которые могут быть выполнены из Монго консоли:

> for (var i = 0; i < 10000000; ++i) { db.countTest.insert({a: i % 10}) } 
> db.countTest.ensureIndex({a:1}) 
> db.countTest.count({a: 1}) 
> db.countTest.count() 
> db.countTest.find().count() 

И мои выводы следующие:

  1. с индексом (appart from id) возвращено кол-во 10 миллионов записей в вокруг 170ms
  2. подсчета по ID (кол-во без какого-либо запроса) возвратил подсчет в менее чем за одну миллисекунду
  3. подсчета по идентификатору с курсором (обратите внимание, что в .find() будет выступать в качестве курсора над сбором) возвращается отсчет в менее чем за одну миллисекунду

так, чем больше в dexes Ваша коллекция имеет медленнее ваш запрос будет. Если вы посчитаете _id, это будет мгновенно, если у вас есть сводный индекс он будет масштаб, основанный на количестве индексов.

+0

Я уже прошел профилирование. Позвольте мне еще раз дать ему снимок. –

+0

@swapnilsawant, возможно, вы можете опубликовать свои журналы журнала system.profile, и я могу помочь вам прочитать их. –

+0

Спасибо. Я вкратце застрял в разных вещах. Я вернусь к этому и опубликую журналы, и если это сработает, я приму свой ответ. –

3

Легче всего было бы

function timeCount(database, collection) { 
    db = db.getSiblingDB(database); 
    var start = new Date().getTime(); 
    db.collection.count(); 
    print("msecs taken: "+ (new Date().getTime() - start)); 
} 

Теперь вы можете вызвать функцию с

timeCount("yourDB","unicorns") 

Вы можете поместить функцию в файл JS и загрузить его с помощью параметра --shell или вы можете поместить его в ваш ~/.mongorc.js и назовите его с каждым db и коллекцией.

+0

Спасибо за помощь. –