我正在尝试查找对包含数百万条测试数据记录的集合执行 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()
我的结论如下:
- 添加索引(来自 id)在大约 170 毫秒 内返回 1000 万条记录的计数
- 按 id 计数(无任何查询的计数)在不到一毫秒 内返回计数
- 使用光标按 id 计数(请注意,.find() 将充当集合上的光标)在不到一毫秒
因此,您的集合的索引越多,您的查询速度就越慢。如果您按 _id 计数,它将是即时的,如果您有一个复合索引,它将根据索引的数量进行扩展。
关于MongoDB:在集合中的数百万条记录上查找 count() 命令的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719782/