mongodb效能分析方法 explain

2021-09-25 18:45:07 字數 4308 閱讀 7316

mongodb效能分析方法:explain()

為了演示的效果,我們先來建立乙個有200萬個文件的記錄。(我自己的電腦耗了15分鐘左右插入完成。如果你想插更多的文件也沒問題,只要有耐心等就可以了。)

mongodb 3.0之後,explain的返回與使用方法與之前版本有了很大的變化,介於3.0之後的優秀特色和我們目前所使用給的是3.0.7版本,本文僅針對mongodb 3.0+的explain進行討論。3.0+的explain有三種模式,分別是:queryplanner、executionstats、allplan***ecution。現實開發中,常用的是executionstats模式,主要分析這種模式。

給這個person集合建立age鍵的索引:db.person.createindex()

1 

10 },

11 "winningplan" : ,

18 "indexname" : "age_1",

19 "ismultikey" : false,

20 "direction" : "forward",

21 "indexbounds" :

26 }

27 },

28 "rejectedplans" :

29 },

30 "executionstats" : ,

65 "indexname" : "age_1",

66 "ismultikey" : false,

67 "direction" : "forward",

68 "indexbounds" : ,

73 "key***amined" : 2001,

74 "dupstested" : 0,

75 "dupsdropped" : 0,

76 "seeninvalidated" : 0,

77 "matchtested" : 0

78 }

79 }

80 },

81 "serverinfo" : ,

87 "ok" : 1.0

88 }

db.getcollection('person').find(}).explain("executionstats")

對queryplanner分析

queryplanner: queryplanner的返回

queryplanner.namespace:該值返回的是該query所查詢的表

queryplanner.indexfilterset:針對該query是否有indexfilter

queryplanner.winningplan:查詢優化器針對該query所返回的最優執行計畫的詳細內容。

queryplanner.winningplan.stage:最優執行計畫的stage,這裡返回是fetch,可以理解為通過返回的index位置去檢索具體的文件(stage有數個模式,將在後文中進行詳解)。

queryplanner.winningplan.inputstage:用來描述子stage,並且為其父stage提供文件和索引關鍵字。

queryplanner.winningplan.stage的child stage,此處是ixscan,表示進行的是index scanning。

queryplanner.winningplan.keypattern:所掃瞄的index內容,此處是did:1,status:1,modify_time: -1與scid : 1

queryplanner.winningplan.indexname:winning plan所選用的index。

queryplanner.winningplan.ismultikey是否是multikey,此處返回是false,如果索引建立在array上,此處將是true。

queryplanner.winningplan.direction:此query的查詢順序,此處是forward,如果用了.sort()將顯示backward。

queryplanner.winningplan.indexbounds:winningplan所掃瞄的索引範圍,如果沒有制定範圍就是[maxkey, minkey],這主要是直接定位到mongodb的chunck中去查詢資料,加快資料讀取。

queryplanner.rejectedplans:其他執行計畫(非最優而被查詢優化器reject的)的詳細返回,其中具體資訊與winningplan的返回中意義相同,故不在此贅述。

對executionstats返回逐層分析

第一層,executiontimemillis

最為直觀explain返回值是executiontimemillis值,指的是我們這條語句的執行時間,這個值當然是希望越少越好。

其中有3個executiontimemillis,分別是:

executionstats.executiontimemillis

該query的整體查詢時間。

executionstats.executionstages.executiontimemillisestimate

該查詢根據index去檢索document獲得2001條資料的時間。

executionstats.executionstages.inputstage.executiontimemillisestimate

該查詢掃瞄2001行index所用時間。

第二層,index與document掃瞄數與查詢返回條目數

這個主要討論3個返回項,nreturned、totalkey***amined、totaldoc***amined,分別代表該條查詢返回的條目、索引掃瞄條目、文件掃瞄條目。

這些都是直觀地影響到executiontimemillis,我們需要掃瞄的越少速度越快。

對於乙個查詢,我們最理想的狀態是:

nreturned=totalkey***amined=totaldoc***amined

第三層,stage狀態分析

那麼又是什麼影響到了totalkey***amined和totaldoc***amined?是stage的型別。型別列舉如下:

collscan:全表掃瞄

ixscan:索引掃瞄

fetch:根據索引去檢索指定document

shard_merge:將各個分片返回資料進行merge

sort:表明在記憶體中進行了排序

limit:使用limit限制返回數

skip:使用skip進行跳過

idhack:針對_id進行查詢

sharding_filter:通過mongos對分片資料進行查詢

count:利用db.coll.explain().count()之類進行count運算

countscan:count不使用index進行count時的stage返回

count_scan:count使用了index進行count時的stage返回

subpla:未使用到索引的$or查詢的stage返回

text:使用全文索引進行查詢時候的stage返回

projection:限定返回字段時候stage的返回

對於普通查詢,我希望看到stage的組合(查詢的時候盡可能用上索引):

fetch+idhack

fetch+ixscan

limit+(fetch+ixscan)

projection+ixscan

sharding_fiter+ixscan

count_scan

不希望看到包含如下的stage:

collscan(全表掃瞄),sort(使用sort但是無index),不合理的skip,subpla(未用到index的$or),countscan(不使用index進行count)

**

MongoDB查詢效能分析

explain 方法能夠提供大量與查詢相關的資訊。對於速度比較慢的查詢來說,它是最重要的效能分析工具之一。通過檢視乙個查詢的explain 輸出資訊,可以知道查詢使用了哪個索引,以及是如何使用的。對於任意查詢,都可以在最後新增乙個explain 呼叫 與呼叫sort 或者limit 一樣,不過exp...

提公升MongoDB效能的方法

mongodb 是高效能資料,但是在使用的過程中,大家偶爾還會碰到一些效能問題。mongodb和其它關係型資料庫相比,例如 sql server mysql oracle 相比來說,相對較新,很多人對其不是很熟悉,所以很多開發 dba往往是注重功能的實現,而忽視了效能的要求。其實,mongodb和 ...

MongoDB資料庫效能分析

設定當前資料庫日誌級別 db.setprofilinglevel n 引用n 0 關閉效能分析,測試環境可以開啟,生成環境關閉,對效能有很大影響 1 開啟慢查詢日誌,執行時間大於100毫秒的語句 2 開啟所有操作日誌 獲取當前資料庫日誌分析級別 db.getprofilinglevel 資料庫的日誌...