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