我正在尝试在包含数百万个testdata记录的集合上找到执行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()需要多长时间?
有没有其他好方法可以做到这一点?
答案 0 :(得分:6)
MongoDB有一个内置的profiller,您可以通过以下方式启用:
db.setProfilingLevel(2)
而不是&#39; 2&#39;您可以从下面的列表中选择任何选项:
您可以通过查看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计算它将是即时,如果您有复合索引,它将根据索引数量进行缩放。
答案 1 :(得分:3)
更简单的方法是
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
并使用每个数据库和集合调用它。