用MongoDB profiler分析慢查询

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

MongoDB profiler是一个很好的工具,可以帮助在数据库运行的时候分析慢查询。默认情况下,慢查询指的是查询时间在100ms以上。这个值是可以修改的。

先看一下怎么用。

step 1 登录到primary server

假定有一个MongoDB Replica-set集群,用mongo shell登录到primary server上。

并且进入你要监控的数据库

use kaimei


step 2 设置profile level

db.setProfilingLevel(1)

step 3 查看慢查询语句

现在MongoDB server会运行的较慢,会将发现的慢查询语句写到db.system.profile集合中。下面演示了查找最近一条慢查询的方法

rs1:PRIMARY> db.system.profile.find().limit(1).sort( { ts : -1 } ).pretty(){    "op" : "query",    "ns" : "kaimei.digital_message",    "query" : {        "query" : {            "display_id" : {                "$in" : [                    ObjectId("52312efca9bb51d66fa724a8"),                    ObjectId("52312efca9bb51d66fa724ab"),                    ObjectId("52312efca9bb51d66fa724ac"),                    ObjectId("52312efca9bb51d66fa724ae"),                    ObjectId("5252c23133f6792263dd1cfe"),                    ObjectId("5271ab5033f6792263dd8cfc"),                    ......                    ObjectId("527710eb33f6792263ddba43"),                    ObjectId("527710eb33f6792263ddba44")                ]            },            "status" : {                "$nin" : [                    "success",                    "deprecated"                ]            }        },        "orderby" : {            "_id" : 1        }    },    "ntoreturn" : 0,    "ntoskip" : 0,    "nscanned" : 210342,    "keyUpdates" : 0,    "numYield" : 454,    "lockStats" : {        "timeLockedMicros" : {            "r" : NumberLong(1755835),            "w" : NumberLong(0)        },        "timeAcquiringMicros" : {            "r" : NumberLong(1145626),            "w" : NumberLong(1599)        }    },    "nreturned" : 0,    "responseLength" : 20,    "millis" : 1147,    "ts" : ISODate("2013-12-10T13:08:05.839Z"),    "client" : "192.168.1.58",    "allUsers" : [ ],    "user" : ""}

这条语句用了1147 ms,查询涉及到_id, display_id和status三个字段. 的确够慢。


step 4 建立索引优化查询

现在看看有什么方法能够优化,通过getIndexes发现display_id和status没有建立索引。因此创建索引

rs1:PRIMARY> db.digital_message.ensureIndex({display_id: 1, status: 1}, {background: true} )rs1:PRIMARY> db.digital_message.getIndexes()[        {                "v" : 1,                "key" : {                        "_id" : 1                },                "ns" : "kaimei.digital_message",                "name" : "_id_"        },        {                "v" : 1,                "key" : {                        "display_id" : 1,                        "status" : 1                },                "ns" : "kaimei.digital_message",                "name" : "display_id_1_status_1",                "background" : true        }]

background: true很重要,可以保证建立索引过程中数据库仍然可以处理请求。这里我建立的是双字段的组合索引。


现在再试一下:

                        ]                },                "status" : {                        "$nin" : [                                "success",                                "deprecated"                        ]                }        },        "updateobj" : {                "$set" : {                        "status" : "sending"                }        },        "nscanned" : 37693,        "nupdated" : 0,        "keyUpdates" : 0,        "numYield" : 3,        "lockStats" : {                "timeLockedMicros" : {                        "r" : NumberLong(0),                        "w" : NumberLong(248113)                },                "timeAcquiringMicros" : {                        "r" : NumberLong(0),                        "w" : NumberLong(114619)                }        },        "millis" : 149,        "ts" : ISODate("2013-12-10T13:30:46.400Z"),        "client" : "192.168.1.55",        "allUsers" : [ ],        "user" : ""}
可以看到速度提升了很多。由于我的in查询至少涉及到1500行以上记录的记录,所以这个149 ms的查询时间是可以接受的。

以后再打开profile时,可以修改慢查询的衡量标准,比如下面就改成了200 ms以上的才算慢查询。

db.setProfilingLevel(1, 200)

step 5 清空profile集合,还原到最初。

db.setProfilingLevel(0)db.system.profile.drop()db.createCollection( "system.profile", { capped: true, size:4000000 } )

官方文档参考: http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/



           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值