繁体   English   中英

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

[英]MongoDB: find execution time for count() command on millions of records in a collection?

我正在尝试寻找在包含数百万个testdata记录的集合上执行count()所需的时间,以下情况是:

1)从1st Mongo Shell,我使用代码将数百万条记录插入到集合中

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

2)我试图从2ndMongo Shell上找到该collection上的count()( Imp:当插入仍在第一Mongo Shell上执行时)

db.unicorns.count()

我研究了一下,但发现explain()和stats()无法应用于count()命令。

一些

我需要找出在集合上进行插入操作时count()需要花费多少时间(类似于实时场景)?

还有其他好的方法吗?

MongoDB具有内置的填充器,您可以通过以下方式启用它:

db.setProfilingLevel(2)

您可以从下面的列表中选择任何选项来代替“ 2”:

  • 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)在大约170毫秒内返回了1000万条记录的计数
  2. 按id计数(不进行任何查询的计数),返回的计数在不到毫秒的时间内
  3. 使用光标用id计数 (请注意,.find()将充当集合上的光标)在不到一毫秒的时间内返回了计数

因此,集合中的索引越多, 查询速度 就越 如果按_id计数,它将是即时的 ;如果您有复合索引 ,它将根据索引的数量进行缩放

更简单的方法是

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并在每个数据库和集合中调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM