最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MongoDB使用profile分析慢查詢的步驟

 更新時間:2021年04月30日 11:59:06   作者:DBA隨筆  
這篇文章主要介紹了MongoDB profile分析慢查詢的示例,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下

      在MongoDB中,如果發(fā)生了慢查詢,我們?nèi)绾蔚玫竭@些慢查詢的語句,并優(yōu)化呢?今天來看這塊兒的一些心得。

01 如何收集慢查詢?

    在MongoDB中,通??梢蚤_啟profile來收集慢日志,查看當前profile狀態(tài)的語句如下:

test1:PRIMARY> db.getProfilingStatus()
{
        "was" : 2,
        "slowms" : 0,
        "sampleRate" : 1,
        "$gleStats" : {
                "lastOpTime" : Timestamp(0, 0),
                "electionId" : ObjectId("7fffffff0000000000000005")
        },
        "lastCommittedOpTime" : Timestamp(1619186976, 2),
        "$configServerState" : {
                "opTime" : {
                        "ts" : Timestamp(1619186976, 1),
                        "t" : NumberLong(2)
                }
        },
        "$clusterTime" : {
                "clusterTime" : Timestamp(1619186976, 2),
                "signature" : {
                        "hash" : BinData(0,"zvwFpgc0KFxieMpj7mBPdrOnonI="),
                        "keyId" : NumberLong("6904838687771590657")
                }
        },
        "operationTime" : Timestamp(1619186976, 2)
}

這里我們可以看到2個關(guān)鍵參數(shù),分別是was和slowms,其中:

was=0,代表不記錄任何的語句;

was=1,代表記錄執(zhí)行時間超過slowms的語句

was=2,代表記錄所有的語句

slowms代表語句的閾值,單位是ms

上圖中的結(jié)果代表我們的實例會收集所有的查詢語句。profile收集的查詢語句結(jié)果存放在admin數(shù)據(jù)庫中的system.profile集合中,可以通過下面的方法進行訪問:

test1:PRIMARY> use admin
switched to db admin

test1:PRIMARY> db.system.profile.find({'op':'query'},{'op':1,'ns':1,'millis':1,'ts':1})
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:14.815Z") }
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:15.139Z") }
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:15.141Z") }
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:15.239Z") }
{ "op" : "query", "ns" : "admin.system.version", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:16.155Z") }
{ "op" : "query", "ns" : "admin.system.version", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:16.192Z") }
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:16.225Z") }
{ "op" : "query", "ns" : "admin.system.users", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:16.273Z") }
{ "op" : "query", "ns" : "admin.system.version", "millis" : 0, "ts" : ISODate("2020-08-27T07:22:16.276Z") }

02 system.profile慢查詢集合分析

   admin數(shù)據(jù)庫中的system.profile是一個固定集合,保存著超過設(shè)置的慢查詢的結(jié)果。我們來看里面的一條慢查詢。

    利用下面的方法,來拿到一條數(shù)據(jù),并對其中的關(guān)鍵字段進行注釋說明:

test1:PRIMARY> db.system.profile.findOne({'op':'query'})
{
        "op" : "query",  # 操作類型
        "ns" : "admin.system.users",  # 命名空間
        "command" : {
                "find" : "system.users",
                "filter" : {
                        "_id" : "admin.root"  # 過濾的字段
                },
                "limit" : 1,
                "singleBatch" : true,
                "lsid" : {
                        "id" : UUID("a6034f5e-77c1-4b19-9669-60e1253edf4b")
                },
                "$readPreference" : {
                        "mode" : "secondaryPreferred"
                },
                "$db" : "admin"
        },
        "keysExamined" : 1,   # 掃描的索引數(shù)
        "docsExamined" : 1,   # 掃描的行數(shù)
        "cursorExhausted" : true,  
        "numYield" : 0,
        "nreturned" : 1,   # 返回的值的行數(shù)
        "locks" : {
                xxxx   #  鎖信息
        },
        "flowControl" : {

        },
        "storage" : {
        },
        "responseLength" : 647,
        "protocol" : "op_query",
        "millis" : 0,    # 這個查詢的執(zhí)行時間,因為我們設(shè)置的profilestatus是0,因此所有操作都被記錄了。
        "planSummary" : "IDHACK",  # 針對_id進行查詢
        "execStats" : {   # 查詢執(zhí)行狀態(tài)
                "stage" : "IDHACK",
                "nReturned" : 1,
                "executionTimeMillisEstimate" : 0,
                "works" : 2,
                "advanced" : 1,
                "needTime" : 0,
                "needYield" : 0,
                "saveState" : 0,
                "restoreState" : 0,
                "isEOF" : 1,
                "keysExamined" : 1,
                "docsExamined" : 1
        },
        "ts" : ISODate("2020-08-27T07:22:14.815Z"),
        "client" : "xx.xx.xx.xx",  # 查詢的客戶端IP地址
        "allUsers" : [   #  所有的用戶信息
                {
                        "user" : "root",
                        "db" : "admin"
                }
        ],
        "user" : "root@admin"   # 使用的用戶信息
}

03 慢查詢分析利器---explain

   通常情況下,我們可以使用MongoDB的explain語法來分析一個語句的查詢性能,包含是否用到索引、掃描行數(shù)等信息,explain語法的基本用法:

后置寫法
db.system.profile.find({'op':'query'}).explain()
前置寫法
db.system.profile.explain().find({'op':'query'})

其中,explain可以放在查詢語句的后面或者前面,當然find語法也可以是update、remove、insert

explain語法的輸出分為3種不同的詳細程度,分別如下:

三種清晰度模式,清晰度越高,則輸出的信息越全,默認情況下是queryPlanner:

1、queryPlanner模式(默認)
db.products.explain().count( { quantity: { $gt: 50 } } )

2、executionStats模式
db.products.explain("executionStats").count( { quantity: { $gt: 50 } } )

3、allPlansExecution模式
db.products.explain("allPlansExecution").count( { quantity: { $gt: 50 } } )

其中,allPlansExecution模式輸出的信息最多。

下面是一個explain語法的輸出內(nèi)容,查詢的SQL如下:

db.getCollection('files').find(
{"cTime":{
           "$gte":ISODate("2021-04-18"),
           "$lt":ISODate("2021-04-19")
       }}).limit(1000).explain("allPlansExecution")

輸出的結(jié)果如下:

{
        "queryPlanner" : {   # 代表查詢的執(zhí)行計劃
                "plannerVersion" : 1,   # 版本號
                "namespace" : "fs.files",   # 查詢的命名空間,也就是集合名稱
                "indexFilterSet" : false,   # 是否使用了索引過濾,注意,它并不能判定是否使用了索引
                "parsedQuery" : {    # 查詢語法解析樹
                        "$and" : [
                                {
                                        "cTime" : {
                                                "$lt" : ISODate("2021-04-19T00:00:00Z")
                                        }
                                },
                                {
                                        "cTime" : {
                                                "$gte" : ISODate("2021-04-18T00:00:00Z")
                                        }
                                }
                        ]
                },
                "winningPlan" : {    # 最終選擇的查詢計劃
                        "stage" : "LIMIT",   # 查詢的階段,很重要,下面詳細介紹
                        "limitAmount" : 1000,   # 查詢結(jié)果的limit值
                        "inputStage" : {
                                "stage" : "FETCH",
                                "inputStage" : {
                                        "stage" : "IXSCAN",  # 代表索引掃描
                                        "keyPattern" : {
                                                "cTime" : 1
                                        },
                                        "indexName" : "cTime_1",  #  索引名稱
                                        "isMultiKey" : false,    # 下面4個字段都是索引類型分析
                                        "isUnique" : false,
                                        "isSparse" : false,
                                        "isPartial" : false,
                                        "indexVersion" : 1,
                                        "direction" : "forward",
                                        "indexBounds" : {
                                                "cTime" : [
                                                        "[new Date(1618704000000), new Date(1618790400000))"
                                                ]
                                        }
                                }
                        }
                },
                "rejectedPlans" : [ ]  # 候選的沒被選中的查詢計劃
        },
        "serverInfo" : {
                "host" : "xxxx",
                "port" : 24999,
                "version" : "3.2.8",
                "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
        },
        "ok" : 1
}

首先解釋下stage的幾個階段:

  1. COLLSCAN---全表掃描
  2. IXSCAN---索引掃描
  3. FETCH---根據(jù)索引去檢索文檔
  4. SHARD_MERGE---合并分片結(jié)果
  5. IDHACK---針對id進行查詢
  6. LIMIT---執(zhí)行l(wèi)imit

了解了這些stage的階段之后,我們可以看到,一個查詢的過程是一層一層解析的,所以可以看到,stage這個字段有嵌套的情況。winningPlan中的執(zhí)行計劃也是按照一層一層的順序去執(zhí)行:

1、先執(zhí)行最內(nèi)層的索引掃描(IXSCAN);

2、再執(zhí)行外面的FETCH,根據(jù)索引去拿文檔

3、執(zhí)行最后一步的limit,取指定數(shù)目個結(jié)果返回給客戶端

以上就是MongoDB profile分析慢查詢的示例的詳細內(nèi)容,更多關(guān)于MongoDB profile分析慢查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MongoDB在Windows系統(tǒng)和Linux系統(tǒng)中實現(xiàn)自動定時備份的操作步驟

    MongoDB在Windows系統(tǒng)和Linux系統(tǒng)中實現(xiàn)自動定時備份的操作步驟

    要在Windows系統(tǒng)中實現(xiàn)自動定時備份MongoDB數(shù)據(jù)庫,可以使用Windows任務(wù)計劃程序和MongoDB自帶的mongodump工具,這篇文章主要介紹了MongoDB在Windows系統(tǒng)和Linux系統(tǒng)中實現(xiàn)自動定時備份的操作步驟,需要的朋友可以參考下
    2023-12-12
  • mongodb本地連接失敗的問題解決

    mongodb本地連接失敗的問題解決

    本文主要介紹了mongodb本地連接失敗的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 淺析Mongodb性能優(yōu)化的相關(guān)問題

    淺析Mongodb性能優(yōu)化的相關(guān)問題

    數(shù)據(jù)庫性能對軟件整體性能的影響是不言而喻的,那么,當我們使用MongoDB時改如何提高數(shù)據(jù)庫性能呢?這篇文章通過范式化與反范式化、填充因子的使用和索引的使用三個方面來談了談Mongodb性能優(yōu)化的相關(guān)問題,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 使用mongodb實現(xiàn)簡單的讀寫操作

    使用mongodb實現(xiàn)簡單的讀寫操作

    這篇文章主要給大家介紹了如何使用mongodb實現(xiàn)簡單的讀寫操作,本文適合初學(xué)者,特別是剛剛安裝了mongodb數(shù)據(jù)庫的朋友,或在atlas剛拿到免費集群的朋友,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-12-12
  • MongoDB的安裝方法圖文教程

    MongoDB的安裝方法圖文教程

    MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。本文給大家介紹了mongodb的安裝教程,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • MongoDB集合的增刪改查管理

    MongoDB集合的增刪改查管理

    這篇文章介紹了MongoDB集合的增刪改查管理,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • MongoDB卸載安裝的詳細安裝教程

    MongoDB卸載安裝的詳細安裝教程

    MongoDB是一個是一個基于分布式文件存儲的數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于MongoDB卸載安裝的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • MongoDB查詢字段沒有創(chuàng)建索引導(dǎo)致的連接超時異常解案例分享

    MongoDB查詢字段沒有創(chuàng)建索引導(dǎo)致的連接超時異常解案例分享

    這篇文章主要介紹了MongoDB查詢字段沒有創(chuàng)建索引導(dǎo)致的連接超時異常解案例分享,本文是生產(chǎn)環(huán)境下總結(jié)而來,需要的朋友可以參考下
    2014-10-10
  • 十個提高MongoDB安全性的配置技巧

    十個提高MongoDB安全性的配置技巧

    這篇文章主要介紹了十個提高MongoDB安全性的配置技巧,需要的朋友可以參考下
    2014-10-10
  • 詳解linux 使用docker安裝mongodb方法

    詳解linux 使用docker安裝mongodb方法

    這篇文章主要介紹了linux 使用docker安裝mongodb方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論

湖州市| 石泉县| 青州市| 钟祥市| 曲靖市| 来安县| 楚雄市| 海宁市| 凯里市| 延川县| 建湖县| 云阳县| 墨玉县| 滁州市| 二连浩特市| 来宾市| 新巴尔虎左旗| 廉江市| 虎林市| 新昌县| 武夷山市| 正安县| 乌鲁木齐县| 阿坝县| 泽州县| 共和县| 蒲江县| 集贤县| 绥德县| 泰和县| 阜城县| 龙海市| 融水| 彭泽县| 府谷县| 和平区| 禄丰县| 柳河县| 浏阳市| 镇宁| 山阴县|