为了账号安全,请及时绑定邮箱和手机立即绑定

[MongoDB]Profiling性能分析

标签:
MongoDB

摘要

上篇文章介绍了mapReduce这个聚合操作。本篇将继续学习,db有了,collection和document也有,基本上够用了,但是随着项目上线后,发现业务数据越来越多,查询效率越来越慢,这时就需要分析慢查询记录了。如何开启慢查询记录?就是本篇文章介绍的内容了。

相关文章

[MongoDB]入门操作

[MongoDB]增删改查

[MongoDB]count,gourp,distinct

[MongoDB]mapReduce

[MongoDB]索引

Profiling 

首先添加测试数据,添加100w吧。

插入时间比较长,你可以通过服务端,查看日志

时间比较久,就插入这么多吧,能说明问题就行

首先需要分析是否需要建立索引,之前的版本可以通过expalin函数进行查看,不过当前使用的版本,通过该函数给出的结果是下面的情况。通过下图的indexFilterSet只能看到没有使用索引,其他的信息并不能帮到我们。

下面这张是@一线码农 园友的图片 可以对比一下 原文:http://www.cnblogs.com/huangxincheng/archive/2012/02/29/2372699.html

不过还有另外的一种方式,通过Profiling ,可以在服务端启动的时候加上该参数,–profile=级别。

也可以通过客户端db.setProfilingLevel(级别) 命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。

level有三种级别

0 – 不开启

  1 – 记录慢命令 (默认为>100ms)

  2 – 记录所有命令

参数为1的时候,默认的慢命令是大于100ms,当然也可以进行设置

 db.setProfilingLevel( level , slowms )   db.setProfilingLevel( 1 , 120 );

Mongodb Profile 记录是直接存在系统db里的,记录位置 system.profile ,我们只要查询这个Collection的记录就可以获取到我们的 Profile 记录了。

执行查询,然后执行profile

> db.users.find({"name":"wolfy"+66666}){ "_id" : ObjectId("5752486fc74b6bdc94876d95"), "name" : "wolfy66666", "age" : 13471 }> db.system.profile.find()

分析结果

复制代码

{    "op": "query",    "ns": "test.system.profile",    "query": {        "find": "system.profile",        "filter": {
           
       }
   },    "keysExamined": 0,    "docsExamined": 0,    "cursorExhausted": true,    "keyUpdates": 0,    "writeConflicts": 0,    "numYield": 0,    "locks": {        "Global": {            "acquireCount": {                "r": NumberLong(2)
           }
       },        "Database": {            "acquireCount": {                "r": NumberLong(1)
           }
       },        "Collection": {            "acquireCount": {                "r": NumberLong(1)
           }
       }
   },    "nreturned": 0,    "responseLength": 110,    "protocol": "op_command",    "millis": 0,    "execStats": {        "stage": "COLLSCAN",        "filter": {            "$and": [
               
           ]
       },        "nReturned": 0,        "executionTimeMillisEstimate": 0,        "works": 2,        "advanced": 0,        "needTime": 1,        "needYield": 0,        "saveState": 0,        "restoreState": 0,        "isEOF": 1,        "invalidates": 0,        "direction": "forward",        "docsExamined": 0
   },    "ts": ISODate("2016-06-04T03:56:35.706Z"),    "client": "127.0.0.1",    "allUsers": [
       
   ],    "user": ""}{    "op": "query",    "ns": "test.users",    "query": {        "find": "users",        "filter": {            "name": "wolfy66666"
       }
   },    "keysExamined": 0,    "docsExamined": 866283,    "cursorExhausted": true,    "keyUpdates": 0,    "writeConflicts": 0,    "numYield": 6767,    "locks": {        "Global": {            "acquireCount": {                "r": NumberLong(13536)
           }
       },        "Database": {            "acquireCount": {                "r": NumberLong(6768)
           }
       },        "Collection": {            "acquireCount": {                "r": NumberLong(6768)
           }
       }
   },    "nreturned": 1,    "responseLength": 160,    "protocol": "op_command",    "millis": 339,    "execStats": {        "stage": "COLLSCAN",        "filter": {            "name": {                "$eq": "wolfy66666"
           }
       },        "nReturned": 1,        "executionTimeMillisEstimate": 310,        "works": 866285,        "advanced": 1,        "needTime": 866283,        "needYield": 0,        "saveState": 6767,        "restoreState": 6767,        "isEOF": 1,        "invalidates": 0,        "direction": "forward",        "docsExamined": 866283
   },    "ts": ISODate("2016-06-04T03:57:10.206Z"),    "client": "127.0.0.1",    "allUsers": [
       
   ],    "user": ""}

复制代码

通过下面的命令可以查看最新的记录

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

还有一种更简洁的查看方式

show profile

该命令可以查看最近的5条记录

profile提供的信息内容解释

 ts:该命令在何时执行。

millis:执行耗时,以毫秒为单位。

op:什么操作。

query:设置的查询条件。

nReturned:返回的条数。

docsExamined:文档扫描条数。

总结

上面列举了profile的使用方法,以及常用的几个分析结果进行解释。感兴趣的可以使用增删改查练练手,尝试一下。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消