MongoDB查看執行計劃

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是默認參數,添加queryPlanner參數的查詢結果就是咱們上文看到的查詢結果,so,這裏再也不贅述。.net

executionStats

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

allPlansExecution用來獲取全部執行計劃,結果參數基本與上文相同,這裏就再也不細說了。

好了,MongoDB中的explain()咱們就說到這裏,小夥伴們有問題歡迎留言討論。

參考資料:

1.《MongoDB權威指南第2版》
2.MongoDB執行計劃獲取(db.collection.explain())
3.mongodb .explain('executionStats') 查詢性能分析(沒找到原文出處)

更多資料請關注公衆號:

圖片描述

相關文章
相關標籤/搜索