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參數詳解_雲論壇_雲社區-華為雲推薦閱讀:
※MongoDB資料庫遭劫 已有16個組織支付贖金
※用 perf 和 SystemTap 跟蹤 MongoDB 訪問超時
※怎樣學 MongoDB?
※Python數據分析及可視化實例之存儲方式簡介
※MongoDB——漸進式開發光伏雲系統實踐(二)