mongodb可以通過profile來監控數據,進行優化。
查看當前是否開啟profile功能用命令
db.getProfilingLevel() ?返回level等級,值為0|1|2,分別代表意思:0代表關閉,1代表記錄慢命令,2代表全部
開始profile功能為
db.setProfilingLevel(level); ?#level等級,值同上
level為1的時候,慢命令默認值為100ms,更改為db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)這樣就更改為50毫秒
通過db.system.profile.find() 查看當前的監控日志。
如:
1
|
> db.system.profile.
find
({millis:{$
gt
:500}})
|
2
|
{
"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 }
|
3
|
{
"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很大,那么有可能查詢的時候沒有加限制。
mongo可以通過db.serverStatus()查看mongod的運行狀態
?
?
01
|
> db.serverStatus()
|
02
|
{
|
03
|
????
"host"
:
"baobao-laptop"
,
#主機名
|
04
|
????
"version"
:
"1.8.2"
,
#版本號
|
05
|
????
"process"
:
"mongod"
,
#進程名
|
06
|
????
"uptime"
: 15549,
#運行時間
|
07
|
????
"uptimeEstimate"
: 15351,
|
08
|
????
"localTime"
: ISODate(
"2011-07-23T06:07:31.220Z"
),當前時間
|
09
|
????
"globalLock"
: {
|
10
|
????????
"totalTime"
: 15548525410,
#總運行時間(ns)
|
11
|
????????
"lockTime"
: 89206633,?
#總的鎖時間(ns)
|
12
|
????????
"ratio"
: 0.005737305027178137,
#鎖比值
|
13
|
????????
"currentQueue"
: {
|
14
|
????????????
"total"
: 0,
#當前需要執行的隊列
|
15
|
????????????
"readers"
: 0,
#讀隊列
|
16
|
????????????
"writers"
: 0
#寫隊列
|
17
|
????????
},
|
18
|
????????
"activeClients"
: {
|
19
|
????????????
"total"
: 0,
#當前客戶端執行的鏈接數
|
20
|
????????????
"readers"
: 0,
#讀鏈接數
|
21
|
????????????
"writers"
: 0
#寫鏈接數
|
22
|
????????
}
|
23
|
????
},
|
24
|
????
"mem"
: {
#內存情況
|
25
|
????????
"bits"
: 32,
#32位系統
|
26
|
????????
"resident"
: 337,
#占有物理內存數
|
27
|
????????
"virtual"
: 599,
#占有虛擬內存
|
28
|
????????
"supported"
:
true
,
#是否支持擴展內存
|
29
|
????????
"mapped"
: 512
|
30
|
????
},
|
31
|
????
"connections"
: {
|
32
|
????????
"current"
: 2,
#當前鏈接數
|
33
|
????????
"available"
: 817
#可用鏈接數
|
34
|
????
},
|
35
|
????
"extra_info"
: {
|
36
|
????????
"note"
:
"fields vary by platform"
,
|
37
|
????????
"heap_usage_bytes"
: 159008,
#堆使用情況字節
|
38
|
????????
"page_faults"
: 907
#頁面故作
|
39
|
????
},
|
40
|
????
"indexCounters"
: {
|
41
|
????????
"btree"
: {
|
42
|
????????????
"accesses"
: 59963,
#索引被訪問數
|
43
|
????????????
"hits"
: 59963,
#所以命中數
|
44
|
????????????
"misses"
: 0,
#索引偏差數
|
45
|
????????????
"resets"
: 0,
#復位數
|
46
|
????????????
"missRatio"
: 0
#未命中率
|
47
|
????????
}
|
48
|
????
},
|
49
|
????
"backgroundFlushing"
: {???
|
50
|
????????
"flushes"
: 259,?
#刷新次數
|
51
|
????????
"total_ms"
: 3395,
#刷新總花費時長
|
52
|
????????
"average_ms"
: 13.108108108108109,
#平均時長
|
53
|
????????
"last_ms"
: 1,
#最后一次時長
|
54
|
????????
"last_finished"
: ISODate(
"2011-07-23T06:07:22.725Z"
)
#最后刷新時間
|
55
|
????
},
|
56
|
????
"cursors"
: {
|
57
|
????????
"totalOpen"
: 0,
#打開游標數
|
58
|
????????
"clientCursors_size"
: 0,
#客戶端游標大小
|
59
|
????????
"timedOut"
: 16
#超時時間
|
60
|
????
},
|
61
|
????
"network"
: {
|
62
|
????????
"bytesIn"
: 285676177,
#輸入數據(byte)
|
63
|
????????
"bytesOut"
: 286564,
#輸出數據(byte)
|
64
|
????????
"numRequests"
: 2012348
#請求數
|
65
|
????
},
|
66
|
????
"opcounters"
: {
|
67
|
????????
"insert"
: 2010000,
#插入操作數
|
68
|
????????
"query"
: 51,
#查詢操作數
|
69
|
????????
"update"
: 5,
#更新操作數
|
70
|
????????
"delete"
: 0,
#刪除操作數
|
71
|
????????
"getmore"
: 0,
#獲取更多的操作數
|
72
|
????????
"command"
: 148
#其他命令操作數
|
73
|
????
},
|
74
|
????
"asserts"
: {
#各個斷言的數量
|
75
|
????????
"regular"
: 0,
|
76
|
????????
"warning"
: 0,
|
77
|
????????
"msg"
: 0,
|
78
|
????????
"user"
: 2131,
|
79
|
????????
"rollovers"
: 0
|
80
|
????
},
|
81
|
????
"writeBacksQueued"
:
false
,
|
82
|
????
"ok"
: 1
|
83
|
}
|
?
db.stats()查看某一個庫的原先狀況
?
01
|
> db.stats()
|
02
|
{
|
03
|
????
"db"
:
"order"
,
#庫名
|
04
|
????
"collections"
: 4,
#集合數
|
05
|
????
"objects"
: 2011622,
#記錄數
|
06
|
????
"avgObjSize"
: 111.92214441878245,
#每條記錄的平均值
|
07
|
????
"dataSize"
: 225145048,
#記錄的總大小
|
08
|
????
"storageSize"
: 307323392,
#預分配的存儲空間
|
09
|
????
"numExtents"
: 21,
#事件數
|
10
|
????
"indexes"
: 1,
#索引數
|
11
|
????
"indexSize"
: 74187744,
#所以大小
|
12
|
????
"fileSize"
: 1056702464,
#文件大小
|
13
|
????
"ok"
: 1
|
14
|
}
|
查看集合記錄用
?
01
|
> db.order.stats()
|
02
|
{
|
03
|
????
"ns"
:
"order.order"
,
#命名空間
|
04
|
????
"count"
: 2010000,
#記錄數
|
05
|
????
"size"
: 225039600,
#大小
|
06
|
????
"avgObjSize"
: 111.96,
|
07
|
????
"storageSize"
: 307186944,
|
08
|
????
"numExtents"
: 18,
|
09
|
????
"nindexes"
: 1,
|
10
|
????
"lastExtentSize"
: 56089856,
|
11
|
????
"paddingFactor"
: 1,
|
12
|
????
"flags"
: 1,
|
13
|
????
"totalIndexSize"
: 74187744,
|
14
|
????
"indexSizes"
: {
|
15
|
????????
"_id_"
: 74187744
#索引為_id_的索引大小
|
16
|
????
},
|
17
|
????
"ok"
: 1
|
18
|
}
|
mongostat命令查看運行中的實時統計,表示每秒實時執行的次數
mongodb還提供了一個機遇http的監控頁面,可以訪問http://ip:28017來查看,這個頁面基本上是對上面的這些命令做了一下綜合,所以這里不細述了。
二.mongodb的優化
根據上面這些監控手段,找到問題后,我們可以進行優化
上面找到了某一下慢的命令,現在我們可以通過執行計劃跟蹤一下,如
01
|
> db.order.
find
({
"status"
: 1.0,
"user.uid"
: { $
gt
: 2663199.0 } }).explain()
|
02
|
{
|
03
|
????
"cursor"
:
"BasicCursor"
,
#游標類型
|
04
|
????
"nscanned"
: 2010000,
#掃描數量
|
05
|
????
"nscannedObjects"
: 2010000,
#掃描對象
|
06
|
????
"n"
: 337800,
#返回數據
|
07
|
????
"millis"
: 2838,
#耗時
|
08
|
????
"nYields"
: 0,
|
09
|
????
"nChunkSkips"
: 0,
|
10
|
????
"isMultiKey"
:
false
,
|
11
|
????
"indexOnly"
:
false
,
|
12
|
????
"indexBounds"
: {
#使用索引(這里沒有)
|
13
|
????????
?
|
14
|
????
}
|
15
|
}
|
對于這樣的,我們可以創建索引
可以通過 ?db.collection.ensureIndex({"字段名":1}) 來創建索引,1為升序,-1為降序,在已經有多數據的情況下,可用后臺來執行,語句db.collection.ensureIndex({"字段名":1} , {backgroud:true})?
獲取索引用db.collection.getIndexes() 查看
這里我們創建一個user.uid的索引 >db.order.ensureIndex({"user.uid":1})
創建后重新執行
01
|
db.order.
find
({
"status"
: 1.0,
"user.uid"
: { $
gt
: 2663199.0 } }).explain()
|
02
|
{
|
03
|
????
"cursor"
:
"BtreeCursor user.uid_1"
,
|
04
|
????
"nscanned"
: 337800,
|
05
|
????
"nscannedObjects"
: 337800,
|
06
|
????
"n"
: 337800,
|
07
|
????
"millis"
: 1371,
|
08
|
????
"nYields"
: 0,
|
09
|
????
"nChunkSkips"
: 0,
|
10
|
????
"isMultiKey"
:
false
,
|
11
|
????
"indexOnly"
:
false
,
|
12
|
????
"indexBounds"
: {
|
13
|
????????
"user.uid"
: [
|
14
|
????????????
[
|
15
|
????????????????
2663199,
|
16
|
????????????????
1.7976931348623157e+308
|
17
|
????????????
]
|
18
|
????????
]
|
19
|
????
}
|
20
|
}
|
掃描數量減少,速度提高。mongodb的索引設計類似與關系數據庫,按索引查找加快書讀,但是多了會對寫有壓力,所以這里就不再敘述了。
?
2.其他優化可以用hint強制索引查找,返回只是需要的數據,對數據分頁等。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
