3

我正在尝试查找对包含数百万条测试数据记录的集合执行 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() 需要多少时间(类似于现场场景)?

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

4

2 回答 2

6

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

因此,您的集合具有的索引越多,您的查询就越慢。如果您按 _id 计数,它将是即时的,如果您有一个复合索引,它将根据索引的数量进行缩放

于 2014-09-08T08:07:55.307 回答
4

更简单的方法是

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 和集合调用它。

于 2014-09-08T10:12:53.730 回答