MongoDB 分析查詢性能

cursor.explain(“executionStats”)和 db.collection.explain(“executionStats”) 方法提供關于查詢性能的相關信息。這些信息可用于衡量查詢是否使用了索引以及如何使用索引。

db.collection.explain() 還提供有關其他操作的執行信息。例如 db.collection.update()。 有關詳情信息,請參見 db.collection.explain() 。

評價查詢性能

考慮采用以下的 inventory 集合文檔:

db.inventory.insert([{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 },{ "_id" : 2, "item" : "f2", type: "food", quantity: 100 },{ "_id" : 3, "item" : "p1", type: "paper", quantity: 200 },{ "_id" : 4, "item" : "p2", type: "paper", quantity: 150 },{ "_id" : 5, "item" : "f3", type: "food", quantity: 300 },{ "_id" : 6, "item" : "t1", type: "toys", quantity: 500 },{ "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 },{ "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 },{ "_id" : 9, "item" : "t2", type: "toys", quantity: 50 },{ "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
]);

不使用索引查詢

以下查詢返回 quantity 值在 100 到 200 之間(含)的文檔:

db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )

將cursor.explain(“executionStats”)游標方法拼接到find 命令的結尾,顯示查詢選擇的計劃:

db.inventory.find({ quantity: { $gte: 100, $lte: 200 } }
).explain("executionStats")

explain() 方法返回如下結果:

{"queryPlanner" : {"plannerVersion" : 1,..."winningPlan" : {"stage" : "COLLSCAN",...}},"executionStats" : {"executionSuccess" : true,"nReturned" : 3,"executionTimeMillis" : 0,"totalKeysExamined" : 0,"totalDocsExamined" : 10,"executionStages" : {"stage" : "COLLSCAN",...},...},...
}
  • queryPlanner.winningPlan.stage 顯示 COLLSCAN 表示集合掃描。

    集合掃描表示mongod必須按照文檔掃描整個文檔集合來匹配結果。這通常是昂貴的操作,可能導致查詢速度慢。

  • executionStats.nReturned 顯示3表示查詢匹配到并返回3個文檔。

  • executionStats.totalKeysExamined 顯示0表示這個查詢沒有使用索引。

  • executionStats.totalDocsExamined 顯示10表示MongoDB掃描了10個文檔,從中查詢匹配到3個文檔。

匹配文檔的數量與檢查文檔的數量之間的差異可能意味著,查詢可以使用索引提高的查詢效率。

基于索引查詢

為了查詢支持 quantity 字段,在 quantity 字段上新增索引:

db.inventory.createIndex( { quantity: 1 } )

使用 explain(“executionStats”) 方法,顯示查詢計劃信息:

db.inventory.find({ quantity: { $gte: 100, $lte: 200 } }
).explain("executionStats")

這個 explain() 方法返回如下結果信息:

{"queryPlanner" : {"plannerVersion" : 1,..."winningPlan" : {"stage" : "FETCH","inputStage" : {"stage" : "IXSCAN","keyPattern" : {"quantity" : 1},...}},"rejectedPlans" : [ ]},"executionStats" : {"executionSuccess" : true,"nReturned" : 3,"executionTimeMillis" : 0,"totalKeysExamined" : 3,"totalDocsExamined" : 3,"executionStages" : {...},...},...
}
  • queryPlanner.winningPlan.inputStage.stage 顯示 IXSCAN 表示使用了索引。
  • executionStats.nReturned 顯示3表示查詢匹配到并返回3個文檔。
  • executionStats.totalKeysExamined 顯示3表示MongoDB 掃描了3個索引數據。 檢查的鍵數與返回的文檔數相匹配,這意味著mongod只需檢查索引鍵即可返回結果。mongod不必掃描所有文檔,只有三個匹配的文檔被拉入內存。 這個查詢結果是非常高效的。
  • executionStats.totalDocsExamined 顯示3表示MongoDB掃描了3個文檔。

沒有使用索引時查詢將掃描整個集合中的10個文檔返回匹配到的3個文檔。查詢時會將它們拉入內存并掃描每個文檔的整體。這個結果非常耗性能并且潛在的會導致查詢變慢。

當使用索引運行時,查詢掃描3個索引條目然后3個文檔中返回匹配到的3個文檔,這個查詢結果非常高效。

比較索引的性能

查詢時不止一個索引時手動的比較索引性能,可以使用 hint() 方法再結合 explain() 方法。

考慮下面的查詢:

db.inventory.find( {quantity: {$gte: 100, $lte: 300},type: "food"
} )

查詢結果如下:

{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 }
{ "_id" : 5, "item" : "f3", "type" : "food", "quantity" : 300 }

為了支持這個查詢,添加復合索引。復合索引中字段的順序很重要

例如,添加如下的2個復合索引。第一個索引先使用 quantity ,再使用 type 字段創建索引。第二個索引先使用 type ,再使用 quantity 字段創建索引。

db.inventory.createIndex( { quantity: 1, type: 1 } )
db.inventory.createIndex( { type: 1, quantity: 1 } )

查詢使用第一個索引來評估性能:

db.inventory.find({ quantity: { $gte: 100, $lte: 300 }, type: "food" }
).hint({ quantity: 1, type: 1 }).explain("executionStats")

這個 explain() 方法返回如下輸出信息:

{"queryPlanner" : {..."winningPlan" : {"stage" : "FETCH","inputStage" : {"stage" : "IXSCAN","keyPattern" : {"quantity" : 1,"type" : 1},...}}},"rejectedPlans" : [ ]},"executionStats" : {"executionSuccess" : true,"nReturned" : 2,"executionTimeMillis" : 0,"totalKeysExamined" : 6,"totalDocsExamined" : 2,"executionStages" : {...}},...
}

MongoDB 掃描了6條索引鍵 (executionStats.totalKeysExamined) 并返回了2條匹配到的文檔(executionStats.nReturned)。

查詢使用第二個索引來評估性能:

db.inventory.find({ quantity: { $gte: 100, $lte: 300 }, type: "food" }
).hint({ type: 1, quantity: 1 }).explain("executionStats")

這個 explain() 方法返回如下輸出信息:

{"queryPlanner" : {..."winningPlan" : {"stage" : "FETCH","inputStage" : {"stage" : "IXSCAN","keyPattern" : {"type" : 1,"quantity" : 1},...}},"rejectedPlans" : [ ]},"executionStats" : {"executionSuccess" : true,"nReturned" : 2,"executionTimeMillis" : 0,"totalKeysExamined" : 2,"totalDocsExamined" : 2,"executionStages" : {...}},...
}

MongoDB 掃描了2條索引鍵 (executionStats.totalKeysExamined) 并返回了2條匹配到的文檔(executionStats.nReturned)。

這個查詢例子中,復合索引 {type:1,quantity:1} 比復合索引 {quantity:1,type:1} 更高效。

個人博客: 學習園

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

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

相關文章

無需復雜插件即可從Eclipse啟動和調試Tomcat

像Eclipse這樣的現代IDE提供了各種插件來簡化Web開發。 但是,我相信將Tomcat作為“常規” Java應用程序啟動仍然可以提供最佳的調試體驗。 大多數情況下,這是因為這些工具將Tomcat或任何其他servlet容器作為外部進程啟動,然后在其上附加一個遠…

flutter 國際化_Flutter 開發實戰資源推薦

開工第一天,來點輕松的資源推薦。這是一篇實戰類資源推薦,其實Flutter的入門資料官方已經做得很好了,如果你是零基礎,還是建議先啃一遍官方的教程,然后再看以下實戰資源,相信在你看官方課程中涉及到的一些疑…

2-5-666:放蘋果

描述把M個同樣的蘋果放在N個同樣的盤子里,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。輸入第一行是測試數據的數目t&#xff08…

JSF和“立即”屬性–命令組件

JSF中的即時屬性通常被誤解。 如果您不相信我&#xff0c;請查看Stack Overflow 。 造成這種混亂的部分原因可能是輸入&#xff08;即<h&#xff1a;inputText />&#xff09;和命令&#xff08;即<h&#xff1a;commandButton />&#xff09;組件都立即可用&#…

通過joystick遙感和按鍵控制機器人--11

原創博客&#xff1a;轉載請表明出處&#xff1a;http://www.cnblogs.com/zxouxuewei/ 1.首先安裝joystick遙控器驅動&#xff1a; sudo apt-get install ros-indigo-joystick-drivers ros-indigo-turtlebot-teleop 2.運行tulterbot機器人&#xff1a; roslaunch rbx1_bringup …

php mysql 線程安全_PHP 線程安全與非線程安全版本的區別深入解析

從2000年10月20日發布的第一個Windows版的PHP3.0.17開始的都是線程安全的版本&#xff0c;這是由于與Linux/Unix系統是采用多進程的工作方式不同的是Windows系統是采用多線程的工作方式。如果在IIS下以CGI方式運行PHP會非常慢&#xff0c;這是由于CGI模式是建立在多進程的基礎之…

奶牛健美操(codevs 3279)

題目描述 Description Farmer John為了保持奶牛們的健康&#xff0c;讓可憐的奶牛們不停在牧場之間 的小路上奔跑。這些奶牛的路徑集合可以被表示成一個點集和一些連接 兩個頂點的雙向路&#xff0c;使得每對點之間恰好有一條簡單路徑。簡單的說來&#xff0c; 這些點的布局就是…

Nginx 實現網站 http、https 配置

在 nginx conf 目錄下新建 ssl 目錄&#xff0c;將申請的 ssl證書文件拷貝到此處&#xff1a; 修改 nginx 配置文件使支持 https&#xff0c;修改如下&#xff1a; server {listen 80;listen 443 ssl;ssl_certificate ssl/cert-xuexiyuan.cn.crt;ssl_certificat…

實用垃圾收集,第1部分–簡介

這是我打算寫的一系列博客文章的第一部分&#xff0c;其目的是解釋垃圾回收在現實世界中的工作方式&#xff08;特別是在JVM中 &#xff09;。 我將介紹一些我認為對于充分理解垃圾收集對于實際目的是必要的理論&#xff0c;但是將其降至最低。 其動機是在各種情況下&#xff0…

數據結構之楊氏矩陣

轉自&#xff1a; http://blog.csdn.net/jiyanfeng1/article/details/8189228轉載于:https://www.cnblogs.com/neversayno/p/5256262.html

mysql 導出 沒有函數_沒有MYSQL FILE函數的CSV導出

構建最佳CSV。你可以按照以下方式做。$filename data.csv;$csv_terminated "\n";$csv_separator ",";$csv_enclosed ";$csv_escaped "\\";$results array(1,2,3);// value$schema_insert ;$header array(a,b,c);// headerfor ($i 0…

使用jdk壓縮war包

首先安裝jdk 壓縮 ..../jdk/bin/jar -cvf file.war file 解壓 ..../jdk/bin/jar -xvf file.war 轉載于:https://www.cnblogs.com/chongchong88/p/6049690.html

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

MongoDB 提供 db.collection.explain(), cursort.explain() 及 explain 命令獲取查詢計劃及查詢計劃執行統計信息。 explain 結果將查詢計劃以階段樹的形式呈現。 每個階段將其結果&#xff08;文檔或索引鍵&#xff09;傳遞給父節點。 葉節點訪問集合或索引。 中間節點操縱由…

.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;注意語句…