MongoDB數(shù)據(jù)庫(kù)查看慢查詢(xún)級(jí)別以及慢查詢(xún)?nèi)罩?/h1>
更新時(shí)間:2023年05月24日 10:55:23 作者:阿福Chris
最近項(xiàng)目上一直在用mongodb作為數(shù)據(jù)庫(kù),mongodb有他的優(yōu)勢(shì),文檔型類(lèi)json格式存儲(chǔ)數(shù)據(jù),修改起來(lái)更方便,但是最近在用mongodb出現(xiàn)了查詢(xún)緩慢的問(wèn)題,這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)查看慢查詢(xún)級(jí)別以及慢查詢(xún)?nèi)罩镜南嚓P(guān)資料,需要的朋友可以參考下
1. MongoDB 慢查詢(xún)記錄功能簡(jiǎn)介
如何定位 MongoDB 數(shù)據(jù)庫(kù)的慢查詢(xún),我想應(yīng)該是很多剛使用 MongoDB 數(shù)據(jù)庫(kù)的朋友最想知道的問(wèn)題。通過(guò)慢查詢(xún)的定位,可以輔助對(duì) MongoDB 中的 collection 進(jìn)行優(yōu)化。
MongoDB 數(shù)據(jù)庫(kù)的慢查詢(xún)數(shù)據(jù)其實(shí)存放在一個(gè)數(shù)據(jù)庫(kù)集合 ( collection ) 中(system.profile),如果你不主動(dòng)創(chuàng)建 system.profile 這個(gè)集合,那這個(gè)集合就固定1M大小,當(dāng)慢查詢(xún)記錄超過(guò)1M,就會(huì)將歷史數(shù)據(jù)覆蓋,循環(huán)使用,所以在這里需要根據(jù)業(yè)務(wù)實(shí)際情況設(shè)置集合大小。
在 MongoDB 中慢查詢(xún)功能(Profiling)設(shè)置有三個(gè)級(jí)別,分別代表如下含義:
- 0:代表關(guān)閉,不收集任何慢查詢(xún)
- 1:收集慢查詢(xún)數(shù)據(jù),默認(rèn)收集超過(guò)100毫秒的慢查詢(xún)
- 2:收集任何操作記錄數(shù)據(jù)
可以通過(guò)在 MongoDB 中執(zhí)行如下命令查看當(dāng)前數(shù)據(jù)庫(kù)的配置,需要特別注意的是,如果你在某一數(shù)據(jù)庫(kù)中調(diào)整了該設(shè)置,那么該操作只對(duì)該數(shù)據(jù)庫(kù)有效,其他數(shù)據(jù)庫(kù)仍需要單獨(dú)設(shè)置:
use test
'switched to db test'
db.getProfilingStatus()
{ was: 1, slowms: 1000, sampleRate: 1, ok: 1 }
2. 如何設(shè)置慢查詢(xún)
2.1 檢查慢查詢(xún)是否開(kāi)啟
執(zhí)行 db.getProfilingStatus()
查詢(xún)數(shù)據(jù)庫(kù),返回結(jié)果是 was: 0 代表 MongoDB 沒(méi)有開(kāi)啟慢查詢(xún)功能;對(duì)應(yīng)的如果不是 0 則表示開(kāi)啟了慢查詢(xún)監(jiān)控功能。
2.2 開(kāi)啟慢查詢(xún)功能
如果你想指定監(jiān)控慢查詢(xún)?cè)谀骋缓撩胫抵系牟樵?xún),例如超過(guò) 1000 毫秒的查詢(xún)被記錄,可以通過(guò)如下語(yǔ)句進(jìn)行設(shè)置:
db.setProfilingLevel(1, {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> slowms: 1000 })
下面這個(gè)例子表示將慢查詢(xún)的級(jí)別設(shè)置為 2
db.setProfilingLevel(2)
{ was: 1, slowms: 500, sampleRate: 1, ok: 1 }
db.getProfilingStatus()
{ was: 2, slowms: 500, sampleRate: 1, ok: 1 }
關(guān)掉慢查詢(xún)功能
db.setProfilingLevel(0)
3. 如何查詢(xún)慢查詢(xún)?nèi)罩?/h2>
假設(shè)上面我們已經(jīng)開(kāi)啟了慢查詢(xún)監(jiān)控功能,那在數(shù)據(jù)庫(kù)使用過(guò)程中,會(huì)將 1000 ms 以上的執(zhí)行查詢(xún)進(jìn)行記錄,下面我們來(lái)看一下如何查詢(xún)這些慢查詢(xún)。
3.1 慢查詢(xún)?nèi)罩静榭?/h3>
查詢(xún)最近的 10 個(gè)慢查詢(xún)?nèi)罩?(運(yùn)行時(shí)間大于等于 8000 毫秒)
db.system.profile.find({"millis":{$gte:8000}}).limit(10).sort( { ts : -1 } ).pretty()
查詢(xún)大于 100 秒的日志
db.system.profile.find( { millis : { $gt : 100000 } } ).pretty()
查詢(xún)時(shí)間從 2023-01-03 15 點(diǎn)整到 2023-01-03 15點(diǎn)30分 之間的日志
db.system.profile.find({ts : {$gt: new ISODate("2023-01-03T07:00:00Z"),$lt: new ISODate("2023-01-03T07:30:00Z")}}).pretty()
備注:注意 Mongo 里面存儲(chǔ)的 ISO 時(shí)間是格林尼治時(shí)間,我們當(dāng)前CST時(shí)間為北京時(shí)間,需要在 ISO 上 +8,所以你可以看到上面我查詢(xún)輸入的時(shí)間為 7 點(diǎn),但實(shí)際上查詢(xún)的是 15 點(diǎn)的數(shù)據(jù)。
補(bǔ)充:mongodb慢查詢(xún)了怎么辦
如果你的 MongoDB 數(shù)據(jù)庫(kù)中出現(xiàn)了慢查詢(xún),你可以嘗試以下幾種方法來(lái)解決問(wèn)題:
找出導(dǎo)致慢查詢(xún)的原因:
使用 MongoDB 的 explain() 方法來(lái)分析查詢(xún)的執(zhí)行計(jì)劃,找出導(dǎo)致慢查詢(xún)的原因。
啟用 MongoDB 的慢查詢(xún)?nèi)罩竟δ埽涗浡樵?xún)的詳細(xì)信息,并分析日志中出現(xiàn)的問(wèn)題。
優(yōu)化查詢(xún):
盡量使用索引來(lái)優(yōu)化查詢(xún),避免使用全表掃描。
盡量減少查詢(xún)中的返回字段數(shù)量,只返回必要的字段。
使用合適的查詢(xún)方式,例如使用 $in 代替 OR 運(yùn)算符。
優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu):
對(duì)于頻繁查詢(xún)的字段,盡量使用索引。
合理劃分分片,避免數(shù)據(jù)傾斜。
合理設(shè)置集合的副本數(shù)量,保證數(shù)據(jù)的可用性。
擴(kuò)展硬件資源:
如果數(shù)據(jù)庫(kù)的硬件資源限制了查詢(xún)性能,可以考慮增加 CPU、內(nèi)存或磁盤(pán)空間等資源。
總結(jié)
到此這篇關(guān)于MongoDB數(shù)據(jù)庫(kù)查看慢查詢(xún)級(jí)別以及慢查詢(xún)?nèi)罩镜奈恼戮徒榻B到這了,更多相關(guān)MongoDB查看慢查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
解決mongo的tickets被耗盡導(dǎo)致卡頓問(wèn)題
這篇文章主要介紹了解決mongo的tickets被耗盡導(dǎo)致卡頓問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-04-04
-
MongoDB安裝、基礎(chǔ)操作和聚合實(shí)例介紹
雖然MongoDB這些年很流行,但筆者之前沒(méi)研究過(guò),現(xiàn)在有需求研究這類(lèi)NoSQL的數(shù)據(jù)庫(kù),是為了驗(yàn)證其是否可被替換,本文給大家介紹MongoDB安裝、基礎(chǔ)操作和聚合實(shí)例詳解,感興趣的朋友一起看看吧 2024-07-07
-
MongoDB.NET 2.2.4驅(qū)動(dòng)版本對(duì)Mongodb3.3數(shù)據(jù)庫(kù)中GridFS增刪改查
這篇文章主要為大家詳細(xì)介紹了使用MongoDB.NET 2.2.4驅(qū)動(dòng)版本對(duì)Mongodb3.3數(shù)據(jù)庫(kù)中GridFS增刪改查,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2016-11-11
-
記一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故
這篇文章主要給大家介紹了關(guān)于一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。 2018-03-03
-
MongoDB數(shù)據(jù)庫(kù)常用的10條操作命令
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。本文簡(jiǎn)單的介紹一些MongoDB數(shù)據(jù)庫(kù)常用的操作命令 2021-06-06
-
mongodb中隨機(jī)獲取1條記錄的實(shí)現(xiàn)方法
這篇文章運(yùn)用實(shí)例給大家演示了如何在mongodb中隨機(jī)獲取1條記錄,文中介紹的很詳細(xì),有需要的朋友們可以參考借鑒。下面來(lái)一起看看吧。 2016-09-09
最新評(píng)論
1. MongoDB 慢查詢(xún)記錄功能簡(jiǎn)介
如何定位 MongoDB 數(shù)據(jù)庫(kù)的慢查詢(xún),我想應(yīng)該是很多剛使用 MongoDB 數(shù)據(jù)庫(kù)的朋友最想知道的問(wèn)題。通過(guò)慢查詢(xún)的定位,可以輔助對(duì) MongoDB 中的 collection 進(jìn)行優(yōu)化。
MongoDB 數(shù)據(jù)庫(kù)的慢查詢(xún)數(shù)據(jù)其實(shí)存放在一個(gè)數(shù)據(jù)庫(kù)集合 ( collection ) 中(system.profile),如果你不主動(dòng)創(chuàng)建 system.profile 這個(gè)集合,那這個(gè)集合就固定1M大小,當(dāng)慢查詢(xún)記錄超過(guò)1M,就會(huì)將歷史數(shù)據(jù)覆蓋,循環(huán)使用,所以在這里需要根據(jù)業(yè)務(wù)實(shí)際情況設(shè)置集合大小。
在 MongoDB 中慢查詢(xún)功能(Profiling)設(shè)置有三個(gè)級(jí)別,分別代表如下含義:
- 0:代表關(guān)閉,不收集任何慢查詢(xún)
- 1:收集慢查詢(xún)數(shù)據(jù),默認(rèn)收集超過(guò)100毫秒的慢查詢(xún)
- 2:收集任何操作記錄數(shù)據(jù)
可以通過(guò)在 MongoDB 中執(zhí)行如下命令查看當(dāng)前數(shù)據(jù)庫(kù)的配置,需要特別注意的是,如果你在某一數(shù)據(jù)庫(kù)中調(diào)整了該設(shè)置,那么該操作只對(duì)該數(shù)據(jù)庫(kù)有效,其他數(shù)據(jù)庫(kù)仍需要單獨(dú)設(shè)置:
use test 'switched to db test' db.getProfilingStatus() { was: 1, slowms: 1000, sampleRate: 1, ok: 1 }
2. 如何設(shè)置慢查詢(xún)
2.1 檢查慢查詢(xún)是否開(kāi)啟
執(zhí)行 db.getProfilingStatus()
查詢(xún)數(shù)據(jù)庫(kù),返回結(jié)果是 was: 0 代表 MongoDB 沒(méi)有開(kāi)啟慢查詢(xún)功能;對(duì)應(yīng)的如果不是 0 則表示開(kāi)啟了慢查詢(xún)監(jiān)控功能。
2.2 開(kāi)啟慢查詢(xún)功能
如果你想指定監(jiān)控慢查詢(xún)?cè)谀骋缓撩胫抵系牟樵?xún),例如超過(guò) 1000 毫秒的查詢(xún)被記錄,可以通過(guò)如下語(yǔ)句進(jìn)行設(shè)置:
db.setProfilingLevel(1, {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> slowms: 1000 })
下面這個(gè)例子表示將慢查詢(xún)的級(jí)別設(shè)置為 2
db.setProfilingLevel(2) { was: 1, slowms: 500, sampleRate: 1, ok: 1 } db.getProfilingStatus() { was: 2, slowms: 500, sampleRate: 1, ok: 1 }
關(guān)掉慢查詢(xún)功能
db.setProfilingLevel(0)
3. 如何查詢(xún)慢查詢(xún)?nèi)罩?/h2>
假設(shè)上面我們已經(jīng)開(kāi)啟了慢查詢(xún)監(jiān)控功能,那在數(shù)據(jù)庫(kù)使用過(guò)程中,會(huì)將 1000 ms 以上的執(zhí)行查詢(xún)進(jìn)行記錄,下面我們來(lái)看一下如何查詢(xún)這些慢查詢(xún)。
3.1 慢查詢(xún)?nèi)罩静榭?/h3>
查詢(xún)最近的 10 個(gè)慢查詢(xún)?nèi)罩?(運(yùn)行時(shí)間大于等于 8000 毫秒)
db.system.profile.find({"millis":{$gte:8000}}).limit(10).sort( { ts : -1 } ).pretty()
查詢(xún)大于 100 秒的日志
db.system.profile.find( { millis : { $gt : 100000 } } ).pretty()
查詢(xún)時(shí)間從 2023-01-03 15 點(diǎn)整到 2023-01-03 15點(diǎn)30分 之間的日志
db.system.profile.find({ts : {$gt: new ISODate("2023-01-03T07:00:00Z"),$lt: new ISODate("2023-01-03T07:30:00Z")}}).pretty()
備注:注意 Mongo 里面存儲(chǔ)的 ISO 時(shí)間是格林尼治時(shí)間,我們當(dāng)前CST時(shí)間為北京時(shí)間,需要在 ISO 上 +8,所以你可以看到上面我查詢(xún)輸入的時(shí)間為 7 點(diǎn),但實(shí)際上查詢(xún)的是 15 點(diǎn)的數(shù)據(jù)。
補(bǔ)充:mongodb慢查詢(xún)了怎么辦
如果你的 MongoDB 數(shù)據(jù)庫(kù)中出現(xiàn)了慢查詢(xún),你可以嘗試以下幾種方法來(lái)解決問(wèn)題:
找出導(dǎo)致慢查詢(xún)的原因:
使用 MongoDB 的 explain() 方法來(lái)分析查詢(xún)的執(zhí)行計(jì)劃,找出導(dǎo)致慢查詢(xún)的原因。
啟用 MongoDB 的慢查詢(xún)?nèi)罩竟δ埽涗浡樵?xún)的詳細(xì)信息,并分析日志中出現(xiàn)的問(wèn)題。
優(yōu)化查詢(xún):
盡量使用索引來(lái)優(yōu)化查詢(xún),避免使用全表掃描。
盡量減少查詢(xún)中的返回字段數(shù)量,只返回必要的字段。
使用合適的查詢(xún)方式,例如使用 $in 代替 OR 運(yùn)算符。
優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu):
對(duì)于頻繁查詢(xún)的字段,盡量使用索引。
合理劃分分片,避免數(shù)據(jù)傾斜。
合理設(shè)置集合的副本數(shù)量,保證數(shù)據(jù)的可用性。
擴(kuò)展硬件資源:
如果數(shù)據(jù)庫(kù)的硬件資源限制了查詢(xún)性能,可以考慮增加 CPU、內(nèi)存或磁盤(pán)空間等資源。
總結(jié)
到此這篇關(guān)于MongoDB數(shù)據(jù)庫(kù)查看慢查詢(xún)級(jí)別以及慢查詢(xún)?nèi)罩镜奈恼戮徒榻B到這了,更多相關(guān)MongoDB查看慢查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決mongo的tickets被耗盡導(dǎo)致卡頓問(wèn)題
這篇文章主要介紹了解決mongo的tickets被耗盡導(dǎo)致卡頓問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04MongoDB安裝、基礎(chǔ)操作和聚合實(shí)例介紹
雖然MongoDB這些年很流行,但筆者之前沒(méi)研究過(guò),現(xiàn)在有需求研究這類(lèi)NoSQL的數(shù)據(jù)庫(kù),是為了驗(yàn)證其是否可被替換,本文給大家介紹MongoDB安裝、基礎(chǔ)操作和聚合實(shí)例詳解,感興趣的朋友一起看看吧2024-07-07MongoDB.NET 2.2.4驅(qū)動(dòng)版本對(duì)Mongodb3.3數(shù)據(jù)庫(kù)中GridFS增刪改查
這篇文章主要為大家詳細(xì)介紹了使用MongoDB.NET 2.2.4驅(qū)動(dòng)版本對(duì)Mongodb3.3數(shù)據(jù)庫(kù)中GridFS增刪改查,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11記一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故
這篇文章主要給大家介紹了關(guān)于一次Mongodb中admin數(shù)據(jù)庫(kù)導(dǎo)致的事故的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03MongoDB數(shù)據(jù)庫(kù)常用的10條操作命令
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。本文簡(jiǎn)單的介紹一些MongoDB數(shù)據(jù)庫(kù)常用的操作命令2021-06-06mongodb中隨機(jī)獲取1條記錄的實(shí)現(xiàn)方法
這篇文章運(yùn)用實(shí)例給大家演示了如何在mongodb中隨機(jī)獲取1條記錄,文中介紹的很詳細(xì),有需要的朋友們可以參考借鑒。下面來(lái)一起看看吧。2016-09-09