1)getting started
explain函数可以实现查看一些查询的过程参数。用法如:
db.yourdb.find().explain()
可以得到一些必要的参数,比如cursor,显示了所使用的游标类型,比如basicCursor和BtreeCursor,后者意味着当前查询使用了索引,因为索引是一类B树,另外还有nscanned字段则显示了扫描的文档的个数。字段n则指明了返回字段的个数。另外还有millis显示了做一次查询所使用的时间,单位是ms。
2)then
我们有些时候会很需要millis字段,因为我们可以通过millis字段了解到当前查询所使用的时间,同时可以通过观察cursor的类型和nscanned&&n三个字段了解到当前通过索引查询的效率。这些都是我们经常关注的东西
3)but
遗憾的事情是,我们并不能一直保证这类的explain的查询会对每一个结果有效,更多的仅限于find方法当中,因此我们有时需要找到一些可替代的方案
① distinct
我们有时候需要在distinct上使用explain函数来查看执行情况,但是很遗憾的是,explain并没有针对distinct的方法,因此我们可以尝试使用runCommand函数来执行distinct,如:
执行db.developers.distinct(“company_category”),我们会得到:
[ 0, 1, 4, 9, 3, 2, 7, 5, 6 ]
但是执行db.runCommand({distinct:’developers’, key:’company_category’})
我们却会得到:
{
“values” : [
0,
1,
4,
9,
3,
2,
7,
5,
6
],
“stats” : {
“n” : 135,
“nscanned” : 135,
“nscannedObjects” : 135,
“timems” : 0,
“cursor” : “BasicCursor”
},
“ok” : 1
}
② new Date
在很多时候我们需要查看一个命令运行的大概时间,那么我们可以尝试一些比较原始的方案:
d = new Date;db.mydatabase.aggregate([{$group:{_id:”$jid”}}]);print(new Date -d + ‘ms’)
即在开始记录一个时间,结束以后记录一个时间,不过这类的时间精度保持在大约ms上。
③ aggregate
有很多mongo的用户会发现aggregate同样也不支持explain,当键入类似db.mydb.aggregate().explain()会发现shell会提示一句:
Wed Mar 4 00:04:41.766 TypeError: Object [object Object] has no method ‘explain’
很令人沮丧,但是这个问题在mongo 2.6以上的版本得到了解决,有感兴趣的用户可以更新mongodb到更新的版本当中来体验一把~