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

标签 mongodb mongodb-query mongo-shell

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

还有其他好的方法吗?

最佳答案

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

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

关于MongoDB:在集合中的数百万条记录上查找 count() 命令的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719782/

相关文章:

php - 在 MacOS Sierra 上找不到 OpenSSL

javascript - 如何在保存到 Mongoose (ExpressJS) 之前格式化模型中的数据

php - Mongodb 组和项目运营商

java - Cursor.hasNext 抛出 java.util.NoSuchElementException

mongodb - 如何在 MongoDB shell 中查看整个数组?

mongodb - 在 Mongo shell 中使用 undefined variable

ruby - 使用 Sinatra 和 MongoDB- 关闭连接?

MongoDB 存储过程不在 javascript 中

MongoDB 按数组子字段分组

java - 复杂的 Mongo Shell 命令转换为 Java 代码