MongoDB中的explain()函數能夠幫助咱們查看查詢相關的信息,這有助於咱們快速查找到搜索瓶頸進而解決它,本文咱們就來看看explain()的一些用法及其查詢結果的含義。 html
本文是MongoDB系列的第八篇文章,瞭解前面的文章有助於更好的理解本文:git
1.Linux上安裝MongoDB
2.MongoDB基本操做
3.MongoDB數據類型
4.MongoDB文檔更新操做
5.MongoDB文檔查詢操做(一)
6.MongoDB文檔查詢操做(二)
7.MongoDB文檔查詢操做(三)mongodb
總體來講,explain()的用法和sort()、limit()用法差很少,不一樣的是explain()必須放在最後面。服務器
先來看一個基本用法:dom
db.sang_collect.find({x:1}).explain()
直接跟在find()函數後面,表示查看find()函數的執行計劃,結果以下:函數
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "sang.sang_collect", "indexFilterSet" : false, "parsedQuery" : { "x" : { "$eq" : 1.0 } }, "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "x" : { "$eq" : 1.0 } }, "direction" : "forward" }, "rejectedPlans" : [] }, "serverInfo" : { "host" : "localhost.localdomain", "port" : 27017, "version" : "3.4.9", "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" }, "ok" : 1.0 }
返回結果包含兩大塊信息,一個是queryPlanner,即查詢計劃,還有一個是serverInfo,即MongoDB服務的一些信息。那麼這裏涉及到的參數比較多,咱們來一一看一下:性能
參數 | 含義 |
---|---|
plannerVersion | 查詢計劃版本 |
namespace | 要查詢的集合 |
indexFilterSet | 是否使用索引 |
parsedQuery | 查詢條件,此處爲x=1 |
winningPlan | 最佳執行計劃 |
stage | 查詢方式,常見的有COLLSCAN/全表掃描、IXSCAN/索引掃描、FETCH/根據索引去檢索文檔、SHARD_MERGE/合併分片結果、IDHACK/針對_id 進行查詢 |
filter | 過濾條件 |
direction | 搜索方向 |
rejectedPlans | 拒絕的執行計劃 |
serverInfo | MongoDB服務器信息 |
explain()也接收不一樣的參數,經過設置不一樣參數咱們能夠查看更詳細的查詢計劃。spa
queryPlanner是默認參數,添加queryPlanner參數的查詢結果就是咱們上文看到的查詢結果,so,這裏再也不贅述。.net
executionStats會返回最佳執行計劃的一些統計信息,以下:rest
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "sang.sang_collect", "indexFilterSet" : false, "parsedQuery" : {}, "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 10000, "executionTimeMillis" : 4, "totalKeysExamined" : 0, "totalDocsExamined" : 10000, "executionStages" : { "stage" : "COLLSCAN", "nReturned" : 10000, "executionTimeMillisEstimate" : 0, "works" : 10002, "advanced" : 10000, "needTime" : 1, "needYield" : 0, "saveState" : 78, "restoreState" : 78, "isEOF" : 1, "invalidates" : 0, "direction" : "forward", "docsExamined" : 10000 } }, "serverInfo" : { "host" : "localhost.localdomain", "port" : 27017, "version" : "3.4.9", "gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" }, "ok" : 1.0 }
這裏除了咱們上文介紹到的一些參數以外,還多了executionStats參數,含義以下:
參數 | 含義 |
---|---|
executionSuccess | 是否執行成功 |
nReturned | 返回的結果數 |
executionTimeMillis | 執行耗時 |
totalKeysExamined | 索引掃描次數 |
totalDocsExamined | 文檔掃描次數 |
executionStages | 這個分類下描述執行的狀態 |
stage | 掃描方式,具體可選值與上文的相同 |
nReturned | 查詢結果數量 |
executionTimeMillisEstimate | 預估耗時 |
works | 工做單元數,一個查詢會分解成小的工做單元 |
advanced | 優先返回的結果數 |
docsExamined | 文檔檢查數目,與totalDocsExamined一致 |
allPlansExecution用來獲取全部執行計劃,結果參數基本與上文相同,這裏就再也不細說了。
好了,MongoDB中的explain()咱們就說到這裏,小夥伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權威指南第2版》
2.MongoDB執行計劃獲取(db.collection.explain())
3.mongodb .explain('executionStats') 查詢性能分析(沒找到原文出處)
更多資料請關注公衆號: