1. 程式人生 > >用MongoDB profiler分析慢查詢

用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

這裡寫圖片描述