我试图找到其上由数以百万计的TESTDATA记录,具有以下情形的集合进行计数()所需的时间: -
1)从1日蒙戈外壳我用的是代码中插入数百万条记录到集合
for (var i = 0; i < 10000000; ++i){
db.unicorns.insert({name: 'sampleName', gender: 'm', weight: '440' });
}
2)从2ndMongo壳我试图找到COUNT()在该集合( 小鬼:当插入还是会被在1日蒙戈壳牌执行)
db.unicorns.count()
我研究却发现解释()和统计()不能与计()命令。
一些
我需要找出需要多少时间来算()时,有插入回事收集(有点像现场的情况)?
是否有这样做的任何其他好办法?
MongoDB中有一个内置的profiller,您可以通过启用:
db.setProfilingLevel(2)
而不是“2”,你可以从列表中选择波纹管的任何选项:
- 0 -分析器是关闭的,不收集任何数据。 mongod的总是比slowOpThresholdMs门槛,其日志写入操作更长的时间。
- 1 -收集仅供较慢的操作分析数据。 默认情况下,缓慢操作是那些超过100毫秒慢。 您可以修改阈值“慢”与slowOpThresholdMs运行选项或命令的setParameter操作。 请参阅指定较慢的操作部分的阈值以获取更多信息。
- 2 -收集分析信息:所有数据库操作的数据。
你可以通过检查MongoDB中的system.profile集合看到你查询的结果..
编辑:
如果你想测试的表现,你可以使用能够从蒙戈控制台执行下面的代码片段:
> 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()
而我的结论如下:
- 围绕170ms 添加索引 (APPART从ID)返回的数10万条记录
- 通过ID在不到一毫秒 计算 (不计任何查询)返回的计数
- 用游标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
和每分贝和收集调用它。
文章来源: MongoDB: find execution time for count() command on millions of records in a collection?