MongoDB調優-查詢優化-MongoDB Profiler

MongoDB查詢優化-MongoDB Profiler

MongoDB Profiler 概述

官方文檔:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/index.htmlhtml

熟悉 Mysql 的人應該知道,Mysql 是有個慢查詢日誌的,它能夠幫助咱們進行優化咱們的 sql,並提升咱們系統的穩定性和流暢性。那麼 MongoDB 中是否也有相似的功能嗎? 是有的,它就是 Database Profiler(下面我直接稱爲慢查詢了),咱們能夠經過設置 Database Profiler 來記錄一些超過閾值的查詢。而後咱們後期能夠經過這些記錄進行優化查詢。sql

MongoDB 的 慢查詢記錄儲存在 system.profile 裏,默認狀況下是關閉的,咱們能夠在數據庫級別上或者是節點級別上配置。mongodb

狀態碼 描述
0 關閉慢查詢,默認狀況下
1 超過閾值的查詢收集
2 爲全部數據庫開啓慢查詢記錄,收集全部的數據

經過 MongoDB shell 啓用

#  爲全部數據庫開啓慢查詢記錄
db.setProfilingLevel(2)
#  指定數據庫,並指定閾值慢查詢 ,超過20毫秒的查詢被記錄
use test
db.setProfilingLevel(1, { slowms: 20 })
#  隨機採集慢查詢的百分比值,sampleRate 值默認爲1,表示都採集,0.42 表示採集42%的內容。
db.setProfilingLevel(1, { sampleRate: 0.42 }) 

# 查詢慢查詢級別和其它信息
db.getProfilingStatus()
# 僅返回慢查詢級別
db.getProfilingLevel()
# 禁用慢查詢
db.setProfilingLevel(0)

經過配置文件啓用

ini 配置文件 mongodb.conf 添加如下參數, profile參數是設置開啓等級,slowms是設置閾值shell

profile = 1
slowms = 300

YAML配置 文件配置數據庫

operationProfiling:
   mode: <string>  # 默認爲 off,可選值 off、slowOp(對應上面的等級 1)、all(對應上面的等級 2)
   slowOpThresholdMs: <int> # 閾值,默認值爲100,單位毫秒
   slowOpSampleRate: <double> #  隨機採集慢查詢的百分比值,sampleRate 值默認爲1,表示都採集,0.42 表示採集42%的內容

經常使用命令和示例

# 查詢最近的10個慢查詢日誌
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()

# 查詢除命令類型爲 ‘command’ 的日誌
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

# 查詢數據庫爲 mydb 集合爲 test 的 日誌
db.system.profile.find( { ns : 'mydb.test' } ).pretty()

# 查詢 低於 5毫秒的日誌
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

# 查詢時間從 2012-12-09 3點整到 2012-12-09 3點40分之間的日誌
db.system.profile.find({
  ts : {
    $gt: new ISODate("2012-12-09T03:00:00Z"),
    $lt: new ISODate("2012-12-09T03:40:00Z")
  }
}).pretty()

MongoDB慢日誌解析

官方文檔:https://docs.mongodb.com/manual/reference/database-profiler/index.htmljson

{
   "op" : "query",   # 操做類型,值可爲command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update
   "ns" : "test.report", # 操做的數據庫和集合
   "command" : {     # 命令
      "find" : "report",  # 操做的集合
      "filter" : { "a" : { "$lte" : 500 } }, # 查詢條件
      "lsid" : {    
         "id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") #用戶的會話id
      },
      "$db" : "test"  # 操做的數據庫
   },
   "cursorid" : 33629063128,  # query和getmore 的遊標id
   "keysExamined" : 101, # MongoDB爲執行操做而掃描的索引鍵的數量
   "docsExamined" : 101, # MongoDB爲了執行操做而掃描的集合中的文檔數。
   "numYield" : 2, # 讓步次數,操做時讓其餘的操做完成的次數。
   "nreturned" : 101, # 操做返回的文檔數
   "queryHash" : "811451DD", # 查詢的hash值
   "planCacheKey" : "759981BA", 
   "locks" : {  # 操做期間的鎖和所的類型
      "Global" : {  #表示全局鎖定
         "acquireCount" : { #鎖定的次數
            "r" : NumberLong(3)  # 表示共享鎖 
         }
      },
      "Database" : {   # 數據庫鎖
         "acquireCount" : { "r" : NumberLong(1) },
         "acquireWaitCount" : { "r" : NumberLong(1) },
         "timeAcquiringMicros" : { "r" : NumberLong(69130694) }
      },
      "Collection" : {  # 集合鎖
         "acquireCount" : { "r" : NumberLong(1) }
      }
   },
   "storage" : { # 儲存
      "data" : {
         "bytesRead" : NumberLong(14736), #操做 從磁盤放到緩存的數據的字節數
         "timeReadingMicros" : NumberLong(17) # 操做 花費在磁盤讀取的時間,以微妙爲單位
      }
   },
   "responseLength" : 1305014, # 操做返回結果的文檔長度,單位爲字節
   "protocol" : "op_msg", # 消息的協議
   "millis" : 69132, # 從 MongoDB 操做開始到結束耗費的時間
   "planSummary" : "IXSCAN { a: 1, _id: -1 }",  # 摘要
   "execStats" : {  # 操做執行過程當中的詳細信息
      "stage" : "FETCH", # 操做形式 ,COLLSCAN 用於集合掃描,IXSCAN 用於掃描索引鍵,FETCH 用於檢索文檔
      "nReturned" : 101, # 返回的文檔數量
      "executionTimeMillisEstimate" : 0,
      "works" : 101,
      "advanced" : 101,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 3,
      "restoreState" : 2,
      "isEOF" : 0,
      "invalidates" : 0,
      "docsExamined" : 101,
      "alreadyHasObj" : 0,
      "inputStage" : {
         ...
      }
   },
   "ts" : ISODate("2019-01-14T16:57:33.450Z"), #操做的時間戳
   "client" : "127.0.0.1",  # 客戶端的ip
   "appName" : "MongoDB Shell", #客戶端應用標識符
   "allUsers" : [
      {
         "user" : "someuser", # 用戶
         "db" : "admin"  # 驗證的數據庫
      }
   ],
   "user" : "someuser@admin"  # 通過驗證的用戶
}
相關文章
相關標籤/搜索