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

Swa*_*ant 1 mongodb mongo-shell mongodb-query

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

1)从第一个Mongo shell我使用代码将数百万条记录插入到集合中

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

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

db.unicorns.count()
Run Code Online (Sandbox Code Playgroud)

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

一些

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

这样做还有其他好方法吗?

Bog*_*san 6

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

db.setProfilingLevel(2)
Run Code Online (Sandbox Code Playgroud)

而不是'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()
Run Code Online (Sandbox Code Playgroud)

我的结论如下:

  1. 添加索引(来自id的appart)在大约170ms内返回了1000万条记录的计数
  2. 按id计数(没有任何查询的计数)在不到一毫秒的时间内返回计数
  3. 用光标计数id(注意.find()将作为集合上的光标)在不到一毫秒的时间内返回计数

因此,您的集合拥有的索引越多,查询速度就越.如果按_id计算,它将是即时的,如果你有一个复合索引,它将根据索引的数量进行扩展.