天天看點

mongdb 慢查詢 mongodb可以通過profile來監控資料 (mongodb性能優化)

檢視mongodb慢查詢

趕緊打開伺服器爸爸,開慢查詢,看下耗時500ms以上的都是些啥:

db.setProfilingLevel(2,500)

看下最近的10條具體的慢查詢指令:

db.system.profile.

find

().limit(10).

sort

({ ts : -1 }).pretty()

看到不少這兩種指令,其中第一種最多,也是跟首頁接口密切關聯的文章表的:

mongodb可以通過profile來監控資料 (mongodb性能優化)

開啟 Profiling  功能 ,對慢查詢進行優化:

mongodb可以通過profile來監控資料,進行優化。

檢視目前是否開啟profile功能用指令

db.getProfilingLevel()  傳回level等級,值為0|1|2,分别代表意思:0代表關閉,1代表記錄慢指令,2代表全部

db.setProfilingLevel(level);  #level等級,值同上

level為1的時候,慢指令預設值為100ms,更改為db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)這樣就更改為50毫秒

通過db.system.profile.find() 檢視目前的監控日志。

如:

> db.system.profile.find({millis:{$gt:500}})
{ "ts" : ISODate("2011-07-23T02:50:13.941Z"), "info" : "query order.order reslen:11022 nscanned:672230  \nquery: { status: 1.0 } nreturned:101 bytes:11006 640ms", "millis" : 640 }
{ "ts" : ISODate("2011-07-23T02:51:00.096Z"), "info" : "query order.order reslen:11146 nscanned:672302  \nquery: { status: 1.0, user.uid: { $gt: 1663199.0 } }  nreturned:101 bytes:11130 647ms", "millis" : 647 }      

 這裡值的含義是

 ts:指令執行時間

info:指令的内容

query:代表查詢

order.order: 代表查詢的庫與集合

reslen:傳回的結果集大小,byte數

nscanned:掃描記錄數量

nquery:後面是查詢條件

nreturned:傳回記錄數及用時

millis:所花時間

如果發現時間比較長,那麼就需要作優化。

比如nscanned數很大,或者接近記錄總數,那麼可能沒有用到索引查詢。

reslen很大,有可能傳回沒必要的字段。

nreturned很大,那麼有可能查詢的時候沒有加限制。

原文轉自:http://my.oschina.net/baowenke/blog/97756

> db.system.profile.find({millis:{$gt:500}})
{ "ts" : ISODate("2011-07-23T02:50:13.941Z"), "info" : "query order.order reslen:11022 nscanned:672230  \nquery: { status: 1.0 } nreturned:101 bytes:11006 640ms", "millis" : 640 }
{ "ts" : ISODate("2011-07-23T02:51:00.096Z"), "info" : "query order.order reslen:11146 nscanned:672302  \nquery: { status: 1.0, user.uid: { $gt: 1663199.0 } }  nreturned:101 bytes:11130 647ms", "millis" : 647 }