用MongoDBprofiler分析慢查询
MongoDB profiler是一个很好的工具,可以帮助在数据库运行的时候分析慢查询。默认情况下,慢查询指的是查询时间在100ms以上。这个值是可以修改的。
先看一下怎么用。
step 1 登录到primary server
假定有一个MongoDB Replica-set集群,用mongo shell登录到primary server上。
step 2 设置profile level
db.setProfilingLevel(1)
现在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" : ""}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")
>更多相关文章
- 10-26如何快速熟悉阿里云新一代PolarDB数据库
- 12-22ORACLE 迁移到 DB2:如何把 Oracle partition 转化到 DB2
- 12-21DB2增差量备份恢复详尽演练
- 12-20DB2在线备份的恢复
- 12-20MongoDB:mongodb的安装和增删改查入门
- 12-20DB2环境变量与参数的备份
- 12-20DB2利用表空间备份重建数据库
- 12-20MongoDB:好好说说mogodb的增删改查
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御