美文网首页
mongodb的explain命令

mongodb的explain命令

作者: JonnyHsu | 来源:发表于2015-03-04 00:06 被阅读0次

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

    相关文章

      网友评论

          本文标题:mongodb的explain命令

          本文链接:https://www.haomeiwen.com/subject/bzzjxttx.html