標籤:

MongoDB查詢過程explain參數詳解

Mongodb提供了db.collections.explain()方法來返回查詢過程中的具體信息,包括查詢過程中的執行統計結果和查詢方案,對於比較慢的查詢來說,是重要的診斷工具之一。通過explain的輸出信息,可以知道查詢使用了哪個所以,以及如何使用的。對於任意的查詢,都可以在最後添加一個explain()。

explain命令有三種模式:

· queryPlanner

· executionStats

· allPlan**ecution

queryPlanner,在非分片模式下,explain返回下列信息:

{

"queryPlanner" : {

"plannerVersion" : <int>,

"namespace" : <string>,

"indexFilterSet" : <boolean>,

"parsedQuery" : {

...

},

"winningPlan" : {

"stage" : <STAGE1>,

...

"inputStage" : {

"stage" : <STAGE2>,

...

"inputStage" : {

...

}

}

},

"rejectedPlans" : [

<candidate plan 1>,

...

]

}

包含查詢優化器選擇等信息:

explain.queryPlanner.namespace:

字元串類型,標識查詢的集合名稱

explain.queryPlanner.indexFilterSet:

boolen類型,標識是否使用索引

explain.queryPlanner.winningPlan:

文檔類型,包含查詢優化器選擇的最優查詢,mongodb通過一個樹形結構來表示不同階段。

explain.queryPlanner.winningPlan.stage:

字元串類型,標識 不同階段的名字,每個階段由一系列具體信息組成,例如,IXSCAN 階段包括索引綁定和掃描,如果一個階段還有一個子階段或者多個子階段,則包含子節點inputStage 或 inputStages

explain.queryPlanner.winningPlan.inputStage:

文檔類型,描述子階段信息。

explain.queryPlanner.winningPlan.inputStages:

數組文檔類型

explain.queryPlanner.rejectedPlans:

標識一組被查詢優化器拒絕的候選執行計劃,如果沒有候選的計劃,該欄位為空。

對於分片集合,winningPlan 包括了每個分片組的詳細信息,例如:

"queryPlanner" : {

...

"winningPlan" : {

...

"shards" : [

{

"shardName" : <shard>,

<queryPlanner information for shard>,

<serverInfo for shard>

},

...

],

},

},

executionStats

返回winningPlan的具體執行信息,要想獲取到該信息,explain必須執行在 executionStats 或者 allPlan**ecution模式下(默認是queryPlanner模式)在非分片模式下,explain會返回一下信息:

"executionStats" : {

"executionSuccess" : <boolean>,

"nReturned" : <int>,

"executionTimeMillis" : <int>,

"to**ey**amined" : <int>,

"totalDoc**amined" : <int>,

"executionStages" : {

"stage" : <STAGE1>

"nReturned" : <int>,

"executionTimeMillisEstimate" : <int>,

"works" : <int>,

"advanced" : <int>,

"needTime" : <int>,

"needYield" : <int>,

"saveState" : <int>,

"restoreState" : <int>,

"isEOF" : <boolean>,

...

"inputStage" : {

"stage" : <STAGE2>,

...

"nReturned" : <int>,

"executionTimeMillisEstimate" : <int>,

"key**amined" : <int>,

"doc**amined" : <int>,

"saveState" : <int>,

"restoreState" : <int>,

...

"inputStage" : {

...

}

}

},

"allPlan**ecution" : [

{ <partial executionStats1> },

{ <partial executionStats2> },

...

]

}

該文檔中返回了winningPlan的完整的執行信息

explain.executionStats.nReturned:

int型,符合查詢條件的文檔數

explain.executionStats.executionTimeMillis:

整個查詢所需要的時間,單位為毫秒

explain.executionStats.to**ey**amined:

整個查詢過程掃描的索引數

explain.executionStats.totalDoc**amined:

整個查詢過程中掃描的文檔數

explain.executionStats.executionStages:

winning plan具體的執行過程可能包含inputStage 或者inputStages

explain.executionStats.executionStages.works:

執行了多少個工作單元,查詢過程會分解為不同的工作單元(「works unit」),例如,檢查一個索引的key值,或者查詢了一個文檔等

explain.executionStats.executionStages.advanced:

有多少中間結果返回

explain.executionStats.executionStages.needTime:

explain.executionStats.executionStages.needYield:

存儲層請求查詢階段暫停處理併產生其鎖的次數。

explain.executionStats.executionStages.saveState:

查詢階段暫停處理並存儲其當前執行狀態的次數

explain.executionStats.executionStages.restoreState:

查詢階段恢復一個執行狀態的次數

explain.executionStats.executionStages.isEOF:

標識執行階段是否結束,1為結束,0表示該階段還有結果需要返回

explain.executionStats.executionStages.inputStage.key**amined:

在查詢過程中,檢查索引的總數

db.keys.find( { x : { $in : [ 3, 4] } } ).explain( "executionStats" )

例如以上查詢結果返回為3,查詢過程中會檢查索引3,4。然後檢查5。總共檢查了3次

explain.executionStats.executionStages.inputStage.doc**amined:

查詢過程中掃描文檔數

serverInfo

"serverInfo" : {

"host" : <string>,

"port" : <int>,

"version" : <string>,

"gitVersion" : <string>

}

文章來源:華為雲社區

MongoDB查詢過程explain參數詳解_雲論壇_雲社區-華為雲?

forum.huaweicloud.com圖標
推薦閱讀:

MongoDB資料庫遭劫 已有16個組織支付贖金
用 perf 和 SystemTap 跟蹤 MongoDB 訪問超時
怎樣學 MongoDB?
Python數據分析及可視化實例之存儲方式簡介
MongoDB——漸進式開發光伏雲系統實踐(二)

TAG:MongoDB | 查詢 |