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

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

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

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

01 如何收集慢查詢?

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

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個(gè)關(guān)鍵參數(shù),分別是was和slowms,其中:

was=0,代表不記錄任何的語(yǔ)句;

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

was=2,代表記錄所有的語(yǔ)句

slowms代表語(yǔ)句的閾值,單位是ms

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

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ù)庫(kù)中的system.profile是一個(gè)固定集合,保存著超過(guò)設(shè)置的慢查詢的結(jié)果。我們來(lái)看里面的一條慢查詢。

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

test1:PRIMARY> db.system.profile.findOne({'op':'query'})
{
        "op" : "query",  # 操作類型
        "ns" : "admin.system.users",  # 命名空間
        "command" : {
                "find" : "system.users",
                "filter" : {
                        "_id" : "admin.root"  # 過(guò)濾的字段
                },
                "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,    # 這個(gè)查詢的執(zhí)行時(shí)間,因?yàn)槲覀冊(cè)O(shè)置的profilestatus是0,因此所有操作都被記錄了。
        "planSummary" : "IDHACK",  # 針對(duì)_id進(jìn)行查詢
        "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語(yǔ)法來(lái)分析一個(gè)語(yǔ)句的查詢性能,包含是否用到索引、掃描行數(shù)等信息,explain語(yǔ)法的基本用法:

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

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

explain語(yǔ)法的輸出分為3種不同的詳細(xì)程度,分別如下:

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

1、queryPlanner模式(默認(rèn))
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模式輸出的信息最多。

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

首先解釋下stage的幾個(gè)階段:

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

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

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

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

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

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

相關(guān)文章

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

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

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

    mongodb本地連接失敗的問(wèn)題解決

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

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

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

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

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

    MongoDB的安裝方法圖文教程

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

    MongoDB集合的增刪改查管理

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

    MongoDB卸載安裝的詳細(xì)安裝教程

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

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

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

    十個(gè)提高M(jìn)ongoDB安全性的配置技巧

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

    詳解linux 使用docker安裝mongodb方法

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

最新評(píng)論

始兴县| 公安县| 合川市| 苍南县| 大新县| 岑溪市| 广宁县| 花莲市| 宣汉县| 遵义县| 思茅市| 萨迦县| 大厂| 图木舒克市| 翁牛特旗| 梓潼县| 曲水县| 读书| 高淳县| 漳浦县| 瓦房店市| 桃园县| 左贡县| 河南省| 东台市| 邢台市| 永仁县| 荣昌县| 浑源县| 玛纳斯县| 洛川县| 甘孜县| 祁门县| 五台县| 屏山县| 开原市| 红河县| 镇平县| 方山县| 茂名市| 古浪县|