檢視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 }