MongoDB:在集合中的数百万条记录上查找count()命令的执行时间?

时间:2014-09-08 08:05:11

标签: mongodb mongodb-query mongo-shell

我正在尝试在包含数百万个testdata记录的集合上找到执行count()所需的时间,具体如下: -

1)从第一个Mongo shell开始,我使用代码

将数百万条记录插入到集合中
for (var i = 0; i < 10000000; ++i){ 
  db.unicorns.insert({name: 'sampleName', gender: 'm', weight: '440' });
}

2)从2ndMongo shell我试图在该集合上找到count()( Imp:,而插入仍然在第一个Mongo Shell上执行)

db.unicorns.count()

我研究过但发现explain()和stats()不能应用于count()命令。

一些

我需要知道在收集插件(类似实时场景)时count()需要多长时间?

有没有其他好方法可以做到这一点?

2 个答案:

答案 0 :(得分:6)

MongoDB有一个内置的profiller,您可以通过以下方式启用:

db.setProfilingLevel(2)

而不是&#39; 2&#39;您可以从下面的列表中选择任何选项:

  • 0 - 探查器关闭,不收集任何数据。 mongod总是将操作长于slowOpThresholdMs阈值写入其日志。
  • 1 - 仅收集慢速操作的分析数据。默认情况下,慢速操作慢于100毫秒。 您可以使用slowOpThresholdMs运行时选项或setParameter命令修改“慢”操作的阈值。有关详细信息,请参阅“指定慢速操作的阈值”部分。
  • 2 - 收集所有数据库操作的分析数据。

您可以通过查看MongoDB中的 system.profile 集合来查看查询结果。

修改

如果要测试性能,可以使用以下可以从mongo控制台执行的代码片段:

> 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. 添加索引(来自ID的appart)在 170ms
  2. 周围返回 1000万条记录的计数
  3. 按ID计算(没有任何查询的计数)以小于1毫秒
  4. 返回计数
  5. 使用光标计数(请注意.find()将作为光标集合)在小于1毫秒
  6. 中返回计数>

    因此更多索引您的收藏集会使您的查询更慢。如果您按_id计算它将是即时,如果您有复合索引,它将根据索引数量进行缩放

答案 1 :(得分: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并使用每个数据库和集合调用它。