当前位置:  NOSQL>mongodb

MongoDB 查询分析

 
分享到:
    发布时间:2017-2-21  


    本文导语: MongoDB 查询分析MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。MongoDB 查询分析常用函数有:explain() 和 hint()。使用 explain()explain 操作提供了查询信息,使用索引及查询统计等。有利于我...

MongoDB 查询分析 

MongoDB 查询分析可以确保我们建议索引是否有效,是查询语句性能分析的重要工具

MongoDB 查询分析常用函数有:explain() 和 hint()。


使用 explain()

explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化

接下来我们在 users 集合中创建 gender 和 user_name 的索引:

>db.users.ensureIndex({gender:1,user_name:1})</p><p>现在在查询语句中使用 explain :</p><pre>>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

以上的 explain() 查询返回如下结果:

{
   "cursor" : "BtreeCursor gender_1_user_name_1",
   "isMultiKey" : false,
   "n" : 1,
   "nscannedObjects" : 0,
   "nscanned" : 1,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 1,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 0,
   "nChunkSkips" : 0,
   "millis" : 0,
   "indexBounds" : {
      "gender" : [
         [
            "M",
            "M"
         ]
      ],
      "user_name" : [
         [
            {
               "$minElement" : 1
            },
            {
               "$maxElement" : 1
            }
         ]
      ]
   }}

现在,我们看看这个结果集的字段:

  • indexOnly: 字段为 true ,表示我们使用了索引。

  • cursor:因为这个查询使用了索引,mongodb 中索引存储在b树结构中,所以这是也使用了 btreecursor 类型的游标。如果没有使用索引,游标的类型是 basiccursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建,由于存储索引信息,这个稍微会提到)来得到索引的详细信息。

  • n:当前查询返回的文档数量。

  • nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。

  • millis:当前查询所需时间,毫秒数。

  • indexBounds:当前查询具体使用的索引。


使用 hint()

虽然MongoDB查询优化器一般工作的很不错,但是也可以使用 hint 来强制 MongoDB 使用一个指定的索引。

这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。

如下查询实例指定了使用 gender 和 user_name 索引字段来查询:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

可以使用 explain() 函数来分析以上查询:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

Mongodb查询详解

Profiling Levels

1 resume

 0 - the profiler is off, does not collect any data.

 1 - collects profiling data for slow operations only. By default slow operations are those slower than 100 milliseconds.

  You can modify the threshold for “slow” operations with the slowms runtime option or the setParameter command. See the Specify the Threshold for Slow Operations section for more information.

 2 - collects profiling data for all database operations.

2 able

2.1 

复制代码 代码示例:

db.setProfilingLevel(1,500);

db.setProfilingLevel(2,500);

PRIMARY> db.setProfilingLevel(1,500);

{ "was" : 0, "slowms" : 500, "ok" : 1 }

PRIMARY> 

PRIMARY> 

PRIMARY> 

PRIMARY> db.setProfilingLevel(1,500);

{ "was" : 1, "slowms" : 500, "ok" : 1 }

PRIMARY> 

PRIMARY> 

PRIMARY>

为什么需要set2次才能生效

解释:

0代表关闭,1代表只记录slowlog,2代表记录所有操作,这里设置成了500,即500ms。

2.2 check the status

 

复制代码 代码示例:

PRIMARY> db.getProfilingStatus();

{ "was" : 2, "slowms" : 500 }

PRIMARY> db.getProfilingLevel();

PRIMARY>

2.3 see the last log info 

复制代码 代码示例:

db.system.profile.find().sort({$natural:-1})  

PRIMARY> db.system.profile.find().sort({$natural:-1})  

{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }

{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }

{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }

PRIMARY>

ts:时间戳 

op: 操作类型

ns:执行操作的对象集合

millis:操作所花时间,毫秒 

client: 执行操作的客户端

user: 执行操作的mongodb连接用户

2.4 可以在mongodb启动之初设置slow生效

直接加在启动命令中:mongod --profile=1 --slowms=15

或在配置文件中写好 用-f强制加载配置文件启动mongodb

 

复制代码 代码示例:

profile=1

slowms=1000

[] 在replicaset中,必须把一个个instance都生效才行。每一个都需要生效一次。

3 see the log

 

复制代码 代码示例:

db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty();

db.system.profile.find().limit(10).sort( { ts : 1 } ).pretty();

4 Disable Profiling

 

复制代码 代码示例:

To disable profiling, use the following helper in the mongo shell: set the default value 0;

db.setProfilingLevel(0)

5 当profile表过小时,调整表大小为4MB 

 

复制代码 代码示例:

db.setProfilingLevel(0)   -- profile失效

db.system.profile.drop()   -- 删除

db.createCollection( "system.profile", { capped: true, size:4000000 } )    -- 重建

db.setProfilingLevel(1)  -- profile生效

6 查看出来的慢mongo命令

6.1 显示最新的5条操作记录

show profile;

6.2 显示结果分析,查询大于5毫秒的slow command。

 

复制代码 代码示例:

db.system.profile.find().sort({millis:-1}).limit(10);

db.system.profile.find( { millis : { $gt : 5 } } ).pretty();

{

        "ts" : ISODate("2013-01-16T18:26:18.041Z"),

        "op" : "query",  -- 执行类型

        "ns" : "ssodatabase.exchangetickets", -- 执行collection名称

        "query" : {

                "xid" : "X15e1481688254bc9a94701b3aa9e7abc627971358360754783"

        },  -- 执行的内容

        "ntoreturn" : 1,

        "nscanned" : 382793,

        "nreturned" : 1,

        "responseLength" : 605,

        "millis" : 5841, -- 执行的时间

        "client" : "10.100.10.161",  -- 执行的客户端

        "user" : "" -- 执行的mongo用户

}

 

观察结果中的"query"字段。  没有直接db.test.insert({xxxxxxx.....})这样显示的,需要你自己根据query字段去拼接取值.

7 返回特定时间的慢查询记录

7.1普通的时间短查询

 

复制代码 代码示例:

db.system.profile.find(

{

 ts : {

       $gt : new ISODate("2013-05-09T03:00:00Z") ,

       $lt : new ISODate("2013-05-17T03:40:00Z")

      }

}

                      ).pretty();

      run the command, follows:

       PRIMARY> db.system.profile.find(

... {

...  ts : {

...        $gt : new ISODate("2013-05-09T03:00:00Z") ,

...        $lt : new ISODate("2013-05-17T03:40:00Z")

...       }

... }

...).pretty();

{

        "ts" : ISODate("2013-05-14T08:36:58.691Z"),

        "op" : "query",

        "ns" : "ssodatabase.digitalriverorderdetails",

        "query" : {

                "invoiceId" : "15539232823"

        },

        "ntoreturn" : 1,

        "nscanned" : 1,

        "nreturned" : 1,

        "responseLength" : 1213,

        "millis" : 663,

        "client" : "10.100.10.162",

        "user" : "admin"

}

{

        "ts" : isodate("2013-05-14t09:17:58.911z"),

        "op" : "insert",

        "ns" : "ssodatabase.tickets",

        "millis" : 527,

        "client" : "10.100.10.154",

        "user" : "admin"

}

{

        "ts" : ISODate("2013-05-14T09:20:58.648Z"),

        "op" : "insert",

        "ns" : "ssodatabase.tickets",

        "millis" : 529,

        "client" : "10.100.10.153",

        "user" : "admin"

}

7.2 带执行时间倒序排序,并且只输出用户信息

 

复制代码 代码示例:

db.system.profile.find(

{

  ts : {

        $gt : new ISODate("2013-05-09T03:00:00Z")  ,

        $lt : new ISODate("2013-05-17T09:40:00Z")

       }

},

{ user : 1 } -- 只输出用户信息

                      ).sort( { millis : -1 } ) -- 倒序排序

 

PRIMARY> db.system.profile.find(

... {

...   ts : {

...         $gt : new ISODate("2013-05-09T03:00:00Z")  ,

...         $lt : new ISODate("2013-05-17T09:40:00Z")

...        }

... },

... { user : 1 } 

...).sort( { millis : -1 } )

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

{ "user" : "admin" }

7.3 带执行时间倒序排序,并且只输出用户信息 

复制代码 代码示例:

db.system.profile.find(

{

  ts : {

        $gt : new ISODate("2013-05-09T03:00:00Z")  ,

        $lt : new ISODate("2013-05-17T09:40:00Z")

       }

}

).sort( { millis : -1 } )  -- 倒序排序

  • 本站(WWW.169IT.COM)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.169IT.COM)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
    转载请注明:文章转载自:[169IT-IT技术资讯]
    本文标题:MongoDB 查询分析
相关文章推荐:


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号