MongoDB查詢性能分析—— explain 操作返回結果詳解

MongoDB 提供 db.collection.explain(), cursort.explain() 及 explain 命令獲取查詢計劃及查詢計劃執行統計信息。

explain 結果將查詢計劃以階段樹的形式呈現。 每個階段將其結果(文檔或索引鍵)傳遞給父節點。 葉節點訪問集合或索引。 中間節點操縱由子節點產生的文檔或索引鍵。 根節點是MongoDB從中派生結果集的最后階段。

階段操作描述,例:

  • COLLSCAN 集合掃描
  • IXSCAN 索引掃描
  • FETCH 檢出文檔
  • SHARD_MERGE 合并分片中結果
  • SHARDING_FILTER 分片中過濾掉孤立文檔
  • LIMIT 使用limit 限制返回數
  • PROJECTION 使用 skip 進行跳過
  • IDHACK 針對_id進行查詢
  • COUNT 利用db.coll.explain().count()之類進行count運算
  • COUNTSCAN count不使用Index進行count時的stage返回
  • COUNT_SCAN count使用了Index進行count時的stage返回
  • SUBPLA 未使用到索引的$or查詢的stage返回
  • TEXT 使用全文索引進行查詢時候的stage返回
  • PROJECTION 限定返回字段時候stage的返回

explain 操作返回結果詳解

queryPlanner

queryPlanner 顯示的是被查詢優化器選擇出來的查詢計劃。

以下未分片集合 explain 操作結果如下:

{"queryPlanner" : {"plannerVersion" : <int>,"namespace" : <string>,"indexFilterSet" : <boolean>,"parsedQuery" : {...},"winningPlan" : {"stage" : <STAGE1>,..."inputStage" : {"stage" : <STAGE2>,..."inputStage" : {...}}},"rejectedPlans" : [<candidate plan 1>,...]}
  • queryPlanner.namespace 一個字符串,指定運行查詢的命名空間(即.)。
  • queryPlanner.indexFilterSet boolan值,表示MongoDB 對于此query shape 是否使用了索引過濾器。
  • queryPlanner.winningPlan 文檔類型,詳細顯示查詢優化程序選擇的查詢計劃。
    • winningPlan.stage 階段名稱。每個階段都有每個階段特有的信息。 例如,IXSCAN 階段將包括索引邊界以及特定于索引掃描的其他數據。 如果階段具有子階段或多個子階段,則階段將具有inputStage 或 inputStages。
    • winningPlan.inputStage 描述子階段的文檔。它為其父級提供文檔或索引鍵。 如果父級只有一個子級,則該字段存在。
    • winningPlan.inputStages 描述子階段的數組。子階段為父階段提供文檔或索引鍵。 如果父級具有多個子節點,則該字段存在。 例如,$or 表達式或索引交集的階段消耗來自多個源的輸入。
  • queryPlanner.rejectedPlans 查詢優化器考慮和拒絕的候選計劃數組。 如果沒有其他候選計劃,則該數組可以為空。

對于分片集合,獲勝計劃包括分每個訪問的分片的計劃信息數組。

executionStats

executionStats 返回的是獲勝計劃執行相關信息。必須在 executionStats 或 allPlansExecution 詳細模式下運行explain才顯示executionStats 相關信息。

要捕獲選擇執行計劃期間執行相關信息,必須使用 allPlansExecution 模式運行。

executionStats 模式 explain 實例:

db.products.explain("executionStats").find({ quantity: { $gt: 50 }, category: "apparel" }
)

allPlansExecution 模式 explain 實例:

db.products.explain("allPlansExecution").update({ quantity: { $lt: 1000}, category: "apparel" },{ $set: { reorder: true } }
)

以下未分片集合 explain 操作結果如下:

"executionStats" : {"executionSuccess" : <boolean>,"nReturned" : <int>,"executionTimeMillis" : <int>,"totalKeysExamined" : <int>,"totalDocsExamined" : <int>,"executionStages" : {"stage" : <STAGE1>"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,"works" : <int>,"advanced" : <int>,"needTime" : <int>,"needYield" : <int>,"isEOF" : <boolean>,..."inputStage" : {"stage" : <STAGE2>,..."nReturned" : <int>,"executionTimeMillisEstimate" : <int>,"keysExamined" : <int>,"docsExamined" : <int>,..."inputStage" : {...}}},"allPlansExecution" : [{ <partial executionStats1> },{ <partial executionStats2> },...]
}
  • executionStats 描述獲勝計劃完整的查詢執行信息。 對于寫入操作,是指將要執行修改的信息,但不會真實修改數據庫。
    • executionStats.nReturned 查詢條件匹配到的文檔數量。
    • executionStats.executionTimeMillis 查詢計劃選擇和查詢執行所需的總時間(以毫秒為單位)。executionTimeMillis 對應于早期版本的MongoDB中cursor.explain() 返回的millis字段。
    • executionStats.totalKeysExamined 掃描的索引條目數。totalKeysExamined 對應于早期版本的MongoDB中cursor.explain() 返回的 nscanned字段。
    • executionStats.totalDocsExamined 掃描的文檔數。totalDocsExamined 對應于早期版本的MongoDB中cursor.explain() 返回的 nscannedObjects字段。
    • executionStats.executionStages 階段樹形式展示獲勝計劃完整的執行信息。即,一個階段可以有一個inputStage或多個inputStages。
      • executionStats.executionStages.works 查詢執行階段執行的“工作單元”的數量。 查詢執行階段將其工作分為小單元。 “工作單位”可能包括檢查單個索引鍵,從集合中提取單個文檔,將投影應用于單個文檔或執行內部記賬。

      • executionStats.executionStages.advanced 返回到父階段的結果數。

      • executionStats.executionStages.needTime 未將中間結果返回給其父級的工作循環數。 例如,索引掃描階段可以花費一個工作周期來尋找索引中的新位置而不是返回索引關鍵字; 這個工作周期將計入explain.executionStats.executionStages.needTime而不是explain.executionStats.executionStages.advanced。

      • executionStats.executionStages.needYield 存儲層請求查詢系統產生鎖定的次數。

      • executionStats.executionStages.isEOF 執行階段是否已到達流的結尾:

        • 如果為true或1,則執行階段已到達流末尾。
        • 如果為false或0,則階段可能仍會返回結果。 例如,有限制的查詢,其執行階段包含LIMIT階段,其中查詢的輸入階段為IXSCAN。 如果查詢返回超過指定的限制,LIMIT階段將報告isEOF:1,但其基礎IXSCAN階段將報告isEOF:0。
      • executionStats.executionStages.inputStage.keysExamined 對于掃描索引的查詢執行階段(例如IXSCAN),keysExamined是在索引掃描過程中檢查的入站和越界鍵的總數。 如果索引掃描由單個連續范圍的鍵組成,則只需要檢查入站鍵。 如果索引邊界由若干鍵范圍組成,則索引掃描執行過程可以檢查越界鍵,以便從一個范圍的末尾跳到下一個范圍的開頭。

        考慮以下示例,集合包含字段x值為1到100的100個文檔,其中索引字段為x:

        for(var x=1;x<=100;x++){db.keys.insert({x:x});
        }
        db.keys.ensureIndex({x:1});
        db.keys.find( { x : { $in : [ 3, 4, 50, 74, 75, 90 ] } } ).explain( "executionStats" )
        

        該查詢將掃描鍵3和4.然后它將掃描鍵5,檢測它是否超出界限,并跳到下一個鍵50。

        繼續該過程,查詢掃描鍵3,4,5,50,51,74,75,76,90和91.鍵5,51,76和91是仍在檢查的越界鍵。 keysExamined的值為10。

      • executionStats.executionStages.inputStage.docsExamined 在查詢執行階段掃描的文檔數。

      • executionStats.allPlansExecution 包含在計劃選擇階段為獲勝和拒絕計劃捕獲的部分執行信息。 僅當explain在allPlansExecution詳細模式下運行時,該字段才會出現。

serverInfo

對于未分片的集合,MongoDB實例explain返回以下信息:

"serverInfo" : {"host" : <string>,"port" : <int>,"version" : <string>,"gitVersion" : <string>
}

對于分片集合,explain返回每個訪問的分片的serverInfo。

Sharded Collection

對于分片集合,explain在shards字段中返回每個訪問的分片的核心查詢規劃器和服務器信息:

{"queryPlanner" : {..."winningPlan" : {..."shards" : [{"shardName" : <shard>,<queryPlanner information for shard>,<serverInfo for shard>},...],},},"executionStats" : {..."executionStages" : {..."shards" : [{"shardName" : <shard>,<executionStats for shard>},...]},"allPlansExecution" : [{"shardName" : <string>,"allPlans" : [ ... ]},...]}
}
  • queryPlanner.winningPlan.shards 每個訪問分片的queryPlanner和serverInfo的文檔數組。
  • executionStats.executionStages.shards 包含每個訪問分片的executionStats的文檔數組。

兼容性的修改

在 3.0 版本中的修改。

explain 結果的格式和字段與以前的版本相比有所變化。 以下列出了一些主要差異。

集合掃描 VS 索引使用

如果查詢計劃程序選擇了集合掃描,則說明結果包括COLLSCAN階段。

如果查詢計劃程序選擇索引,則說明結果包括IXSCAN階段。 該階段包括諸如索引key的匹配,遍歷方向和索引邊界之類的信息。

在早期版本的MongoDB中,cursor.explain() 返回了光標字段,其值為:

用于集合掃描的BasicCursor,以及索引掃描的BtreeCursor <索引名稱> [<方向>]。

覆蓋查詢

當索引覆蓋查詢時,MongoDB可以匹配查詢條件并僅使用索引鍵返回結果; 即MongoDB不需要檢查集合中的文檔以返回結果。

當索引覆蓋查詢時,解釋結果的IXSCAN階段不是FETCH階段的后代,而在executionStats中,totalDocsExamined為0。

在早期版本的MongoDB中,cursor.explain() 返回indexOnly字段以指示索引是否覆蓋了查詢。

索引交叉

對于索引交集計劃,結果將包括AND_SORTED階段或AND_HASH階段,其中包含詳細說明索引的inputStages數組; 例如。:

{"stage" : "AND_SORTED","inputStages" : [{"stage" : "IXSCAN",...},{"stage" : "IXSCAN",...}]
}

在以前版本的MongoDB中,cursor.explain() 返回了游標字段,其中包含索引交叉點的復雜計劃。

$or 表達式

如果MongoDB使用$or 表達式的索引,則結果將包含OR階段,其中包含詳細說明索引的inputStages數組; 例如。:

{"stage" : "OR","inputStages" : [{"stage" : "IXSCAN",...},{"stage" : "IXSCAN",...},...]
}

在早期版本的MongoDB中,cursor.explain() 返回了詳細索引的子句數組。

Sort 階段

如果MongoDB可以使用索引掃描來獲取請求的排序順序,則結果將不包括SORT階段。 否則,如果MongoDB無法使用索引進行排序,則解釋結果將包括SORT階段。

在MongoDB 3.0之前,cursor.explain() 返回scanAndOrder字段以指定MongoDB是否可以使用索引順序返回排序結果。

總結

explain 希望看到的階段

Fetch+IDHACK

Fetch+ixscan

Limit+(Fetch+ixscan)

PROJECTION+ixscan

SHARDING_FILTER+ixscan

COUNT_SCAN

explain 不希望看到的階段

COLLSCAN(全表掃描),

SORT(使用sort但是無index),

不合理的SKIP,

SUBPLA(未用到index的$or),

COUNTSCAN

來自個人博客:學習園
http://www.xuexiyuan.cn/article/detail/179.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.deb包的安裝方法

deb是Debian linux的安裝格式&#xff0c;跟redhat的rpm非常相似&#xff0c;最基本的安裝命令是&#xff1a; dpkg -i file.deb dpkg是Debian Package的簡寫&#xff0c;是為Debian專門開發的管理系統套件&#xff0c;方便軟件的安裝&#xff0c;更新和移除。所有源自Debian的…

html回復評論_3天內看了3000多篇《哈佛商業評論》,挑出來最有用的分享下

上次分享過一個工具&#xff1a;一鍵批量下載公眾號歷史消息&#xff08;后臺回復001獲取&#xff09;。我把《哈佛商業評論》的歷史文章&#xff0c;全部爬了下來。該雜志被全球商業譽為“管理圣經”。我最感興趣的一部分是&#xff1a;個人管理。先搜索關鍵詞&#xff1a;&qu…

Java中的高性能庫

越來越多的庫被描述為高性能&#xff0c;并且有支持該要求的基準。 這是我所知道的選擇。 Disruptor庫 – http://code.google.com/p/disruptor/ LMAX旨在成為世界上最快的交易平臺。 顯然&#xff0c;為了實現這一目標&#xff0c;我們需要做一些特殊的事情&#xff0c;以通過…

Linux 命令行上執行多個命令(分隔符簡介使用)

Linux 系統可以在一個命令行上執行多個命令&#xff0c;相應的命令行的分隔符簡介及使用如下&#xff1a; ; 如果命令被分號(;)所分隔&#xff0c;那么命令會連續的執行下去&#xff0c;就算是錯誤的命令也會繼續執行后面的命令。示例如下&#xff1a; ls /home/; ls /etc/i…

codeforces 732/D 二分

給出考試時間和考試需要準備的時間&#xff0c;問最早考完所有科目的時間 二分答案 NlogN 二分抄神犇的寫法 感覺挺舒服的嘻嘻嘻 1 #include<bits/stdc.h>2 using namespace std;3 const int MAXN1e55;4 int N,M,d[MAXN],w[MAXN],cnt[MAXN];5 void read(int &x){6 …

XML基礎(二)

XML命名規則&#xff1a; ①名稱可以含字母、數字以及其他的字符 ②名稱不能以數字或標點符號開始 ③名稱不能以“xml”開始 ④名稱不能包含空格 ⑤盡量避免"-", "." ,":"等字符 xml元素是可擴展的。 XML屬性&#xff1a; 屬性提供有關元素的額外…

NoSQLBooster for MongoDB 中跨庫關聯查詢

? 使用 MongoDB 是我們常常會遇到一些特殊的需求需要跨庫關聯查詢&#xff0c;比如訂單明細缺商品重量需要補商品重量&#xff0c;而商品重量數據又在商品庫中&#xff0c;這事就需要跨庫關聯操作&#xff0c;示例代碼如下&#xff1a; // 使用 order 庫&#xff0c;注意語句…

網頁版的svn怎樣同步代碼_學會使用Hdlbits網頁版Verilog代碼仿真驗證平臺

大家推薦一款網頁版的 Verilog代碼編輯仿真驗證平臺&#xff0c;這個平臺是國外的一家開源FPGA學習網站&#xff0c;通過“https://hdlbits.01xz.net/wiki/Main_Page”地址鏈接進入網頁&#xff0c;在該網頁上可以進行Verilog代碼的編寫、綜合&#xff0c;而且最后還能夠仿真出…

遇到的零碎問題

Show()時&#xff0c;其他窗口仍可響應&#xff0c;ShowDialog()時其他窗口無響應。 在public Form1()中使用messagebox會先出現信息窗口&#xff0c;再顯示主窗體&#xff0c;故考慮加入了start按鈕。 play()會被打斷&#xff0c;PlaySync&#xff08;&#xff09;會播放完再執…

Tomcat上具有JAX-WS的Web服務

讓我們假設一家企業正在一個集中式系統中維護用戶身份驗證詳細信息。 我們需要創建一個AuthenticationService&#xff0c;它將獲取憑據&#xff0c;對其進行驗證并返回狀態。 其余的應用程序將使用AuthenticationService對用戶進行身份驗證。 創建AuthenticationService接口&a…

Python的下載及安裝

1、官網下載地址&#xff1a;https://www.python.org/downloads/ 2、python設置環境變量&#xff1a; 在系統變量里添加Python的安裝位置 3、在cmd里輸入python里即可轉載于:https://www.cnblogs.com/fun0623/p/5257573.html

MongoDB 字段拼接 $concat(aggregation)

$concat 拼接字符串操作&#xff0c;返回拼接后的字符串。語法格式如下&#xff1a; { $concat: [ <expression1>, <expression2>, ... ] }參數可以是任何有效的表達式&#xff0c;只要它們解析為字符串即可。 有關表達式的更多信息&#xff0c;請參閱表達式。 示…

cmake mysql 編譯參數_Cmake-MySQL編譯參數說明

Cmake-MySQL編譯參數說明(來源于MySQL官方手冊)https://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.htmlFormats Description DefaultIntroduced Removed ##格式描述默認導入刪除BUILD_CONFIG Use same build options as official releases ##b使用相同…

動態給H5頁面綁定數據,基本萬能無錯誤!

此為原創&#xff0c;轉載請注明出處&#xff01; /* * 共通用綁定頁面數據用方法 * * param bingData 需要綁定的數據 * * return 無 * */function commonBindData(bingData) { // 取得需綁定的json數據 var jsonArray eval("(" bingData ")"); // …

c語言函數---M

書畫小說軟件 制作更滿意的讀、更舒心的寫、更輕松的公布最全古典小說網 由本軟件公布所得main()主函數 每一C 程序都必須有一main()函數, 能夠依據自己的愛好把它放在程序的某 個地方。有些程序猿把它放在最前面, 而還有一些程序猿把它放在最后面, 不管放 在哪個地方, 下面幾…

使用Apache ActiveMQ的JMS開發基礎

去年是我嘗試JMS的時候。 背后的想法和概念讓我有些困惑&#xff0c;但是當我知道它的用途后&#xff0c;我很快就掌握了它。 在本文中&#xff0c;我將展示使用Apache ActiveMQ作為后端使用Java開發簡單的生產者/消費者的基礎。 讓我們首先從概念開始&#xff0c;這是一個簡單…

vijos p1460——拉力賽

描述 車展結束后&#xff0c;游樂園決定舉辦一次盛大的山道拉力賽&#xff0c;平平和韻韻自然也要來參加大賽。 賽場上共有n個連通的計時點&#xff0c;n-1條賽道&#xff08;構成了一棵樹&#xff09;。每個計時點的高度都不相同&#xff08;父結點的高度必然大于子結點&#…

mysql acid_Mysql中ACID的原理

原子性 (Atomicity)原子性是指一個事務是一個不可分割的工作單位&#xff0c;其中的操作要么都做&#xff0c;要么都不做。隔離性 (Isolation)隔離性是指多個事務并發執行的時候&#xff0c;事務內部的操作與其他事務是隔離的&#xff0c;并發執行的各個事務之間不能互相干擾…

MongoDB 自動刪除集合中過期的數據——TTL索引

簡介 ? TTL (Time To Live, 有生命周期的) 索引是特殊單字段索引&#xff0c;MongoDB可以用來在一定時間后自動從集合中刪除文檔的特殊索引。 這對于某些類型的數據非常好&#xff0c;例如機器生成的事件數據&#xff0c;日志和會話信息&#xff0c;這些信息只需要在數據庫中…

PLSQL 經常自動斷開失去連接的解決過程

問題背景&#xff1a; 情況是這樣的&#xff0c;很多開發同事的PLSQL上班時間開著8個小時&#xff0c;有時候他們出去抽煙后或者中午吃完飯&#xff0c;回來在PLSQL上面執行就報錯無響應&#xff0c;然后卡住了半天動彈不了&#xff0c;非得重新登錄plsql才生效&#xff0c;我猜…