mongodb的explain命令

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到更新的版本当中来体验一把~

    原文作者:JonnyHsu
    原文地址: https://www.jianshu.com/p/de80355a7a5b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞