我的專欄地址:我的segmentfault,歡迎瀏覽
MongoDB 3.0之后,explain的返回與使用方法與之前版本有了不少變化,介于3.0之后的優(yōu)秀特色,本文僅針對MongoDB 3.0+的explain進行討論。
現(xiàn)版本explain有三種模式,分別如下:
queryPlanner
executionStats
allPlansExecution
其中 queryPlanner 是現(xiàn)版本explain的默認(rèn)模式,queryPlanner模式下并不會去真正進行query語句查詢,而是針對query語句進行執(zhí)行計劃分析并選出winning plan。
舉個執(zhí)行計劃的命令例子: db.usertable.find({"w": 1}).explain("queryPlanner") 舉個執(zhí)行計劃響應(yīng)結(jié)果的例子: { "queryPlanner":{ "plannerVersion":1, "namespace":"game_db.game_user", #該值返回的是該query所查詢的表 "indexFilterSet":false, #是否應(yīng)用了index filter "parsedQuery":{ #查詢條件 "w":{ "$eq":1 } }, "winningPlan":{ #查詢優(yōu)化器針對該query所返回的最優(yōu)執(zhí)行計劃的詳細(xì)內(nèi)容 "stage":"FETCH", #最優(yōu)執(zhí)行計劃的stage,這里返回是FETCH,可以理解為通過返回的index位置去檢索具體的文檔 "inputStage":{ # #explain.queryPlanner.winningPlan.stage的child stage,此處是IXSCAN,表示進行的是index scanning。 "stage":"IXSCAN", #索引查找 "keyPattern":{ #所掃描的index內(nèi)容,此處是w:1與n:1。 "w":1, "n":1 }, "indexName":"w_1_n_1", #winning plan所選用的index。 "isMultiKey":false, #本次查詢是否使用了多鍵、復(fù)合索引 "direction":"forward", #此query的查詢順序,此處是forward,如果用了.sort({w:-1})將顯示backward。 "indexBounds":{ #winningplan所掃描的索引范圍,此處查詢條件是w:1,使用的index是w與n的聯(lián)合索引,故w是[1.0,1.0]而n沒有指定在查詢條件中,故是[MinKey,MaxKey]。 "w":[ "[1.0, 1.0]" ], "n":[ "[MinKey, MaxKey]" ] } } }, "rejectedPlans":[ #其他執(zhí)行計劃(非最優(yōu)而被查詢優(yōu)化器reject的)的詳細(xì)返回,其中具體信息與winningPlan的返回中意義相同,故不在此贅述。 { "stage":"FETCH", "inputStage":{ "stage":"IXSCAN", "keyPattern":{ "w":1, "v":1 }, "indexName":"w_1_v_1", "isMultiKey":false, "direction":"forward", "indexBounds":{ "w":[ "[1.0, 1.0]" ], "v":[ "[MinKey, MaxKey]" ] } } } ] }, "serverInfo" : { "host" : "ALI-SZ-VT-TEST001", "port" : 27017, "version" : "4.0.5", "gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412" }, "ok" : 1 }二、queryPlanner學(xué)習(xí) 2.1 Stage的意義
如explain.queryPlanner.winningPlan.stageexplain.queryPlanner.winningPlan.inputStage**等。
stage/inputStage值 | 值的意義 |
---|---|
COLLSCAN | 全表掃描 |
IXSCAN | 索引掃描 |
FETCH | 根據(jù)索引去檢索指定document |
SHARD_MERGE | 將各個分片返回數(shù)據(jù)進行merge |
SORT | 表明在內(nèi)存中進行了排序(與老版本的scanAndOrder:true一致) |
LIMIT | 使用limit限制返回數(shù) |
SKIP | 使用skip進行跳過 |
IDHACK | 針對_id進行查詢 |
SHARDING_FILTER | 通過mongos對分片數(shù)據(jù)進行查詢 |
COUNT | 利用db.coll.explain().count()之類進行count運算 |
COUNTSCAN | count不使用用Index進行count時的stage返回 |
COUNT_SCAN | count使用了Index進行count時的stage返回 |
SUBPLA | 未使用到索引的$or查詢的stage返回 |
TEXT | 使用全文索引進行查詢時候的stage返回 |
PROJECTION | 限定返回字段時候stage的返回 |
執(zhí)行一:
db.usertable.find({"field0": "use"}).explain("queryPlanner") { ... "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "field0" : { "$eq" : "use" } }, "direction" : "forward" }, ... }
執(zhí)行二:
db.usertable.find({"field0": "use"}).limit(1).explain("queryPlanner") { ... "winningPlan" : { "stage" : "LIMIT", "limitAmount" : 1, "inputStage" : { "stage" : "COLLSCAN", "filter" : { "field0" : { "$eq" : "use" } }, "direction" : "forward" } }, ... }
執(zhí)行二在執(zhí)行一的基礎(chǔ)上增加了 limit限掉, queryPlanner由 stage(COLLSCAN) 變成了 stage(LIMIT)、inputStage.stage(COLLSCAN)。說明在判斷queryPlanner是否達到用戶想要的效果要對 stageinputStage.stag綜合考慮。
參考文章:MongoDB干貨系列2-MongoDB執(zhí)行計劃分析詳解 http://www.mongoing.com/eshu_explain2
官方文檔: https://docs.mongodb.com/manual/tutorial/analyze-query-plan/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19476.html
摘要:執(zhí)行計劃之前發(fā)了一篇關(guān)于執(zhí)行計劃的說明。利用執(zhí)行計劃,我們可以判斷每一次的執(zhí)行情況和給出的執(zhí)行建議。在中跑執(zhí)行計劃的命令,舉個例子執(zhí)行計劃的模式為三種。程序中跑執(zhí)行計劃我使用的是庫用的是。響應(yīng)結(jié)果會有執(zhí)行時間掃描記錄數(shù)等真實的執(zhí)行情況。 執(zhí)行計劃 之前發(fā)了一篇關(guān)于mongodb執(zhí)行計劃的說明。利用執(zhí)行計劃,我們可以判斷每一次sql的執(zhí)行情況和mongodb給出的執(zhí)行建議。在mongo ...
摘要:正是存在問題,促使我們考慮引入數(shù)據(jù)庫審核平臺。的確,與很多互聯(lián)網(wǎng)公司相比,數(shù)據(jù)庫數(shù)十套的估摸并不是太大但與互聯(lián)網(wǎng)類公司不同,類似宜信這類金融類公司對數(shù)據(jù)庫的依賴性更大,大量的應(yīng)用是重數(shù)據(jù)庫類的,且其使用復(fù)雜程度也遠比互聯(lián)網(wǎng)類的復(fù)雜。 作者:韓鋒 出處:DBAplus社群分享 Themis開源地址:https://github.com/CreditEaseDBA 拓展閱讀:宜信開源|數(shù)...
摘要:整體來說,通過查看執(zhí)行計劃,分析查詢性能情況,可以幫助我們更好的分析和優(yōu)化,必要的時候可以創(chuàng)建索引,提升查詢性能。 一、概述 MongoDB中的explain()函數(shù)可以幫助我們查看查詢相關(guān)的信息,查詢分析可以確保我們創(chuàng)建的索引是否有效,是查詢語句性能分析的重要工具。 二、explain()基本用法 explain()的用法是必須放在最后面,語法如下: db.collecton.fin...
摘要:優(yōu)志愿張海鵬宋體背景宋體每年月下旬到月下旬期間是高考填志愿的高峰期,也是優(yōu)志愿后端面臨大流量高并發(fā)請求的業(yè)務(wù)高峰期。對于優(yōu)志愿讀多寫少的場景及其業(yè)務(wù)高峰期,用戶可以按需增刪節(jié)點,更好地實現(xiàn)讀取性能的擴展。 隨著用戶規(guī)模的增長,數(shù)據(jù)庫的壓力也在成倍增加。面對大流量、高并發(fā),UCloud MongoDB 做到了高效,并展現(xiàn)出了更好的性能體驗。 —— 優(yōu)志愿 CTO 張海鵬 背景...
閱讀 2234·2021-11-22 15:29
閱讀 4114·2021-11-04 16:13
閱讀 1000·2019-08-29 16:58
閱讀 346·2019-08-29 16:08
閱讀 1467·2019-08-23 17:56
閱讀 2393·2019-08-23 17:06
閱讀 3172·2019-08-23 16:55
閱讀 2068·2019-08-23 16:22