mongodb執(zhí)行計(jì)劃說(shuō)明-創(chuàng)新互聯(lián)

創(chuàng)建documents:

創(chuàng)新互聯(lián)公司為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、app軟件開發(fā)、小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

for (i=0;i<1000000;i++){
db.users.insert(
{
"i":i,
"username":"user"+i,
"age":Math.floor(Math.random()*120),
"create":new Date()
}
);
}

創(chuàng)建索引:

db.users.createIndex({i:1},{background:1})

執(zhí)行計(jì)劃:

mongodb 3 explain有三種模式

db.users.find({i:90000}).explain()

db.users.find({i:90000}).explain("queryPlanner") #explain的默認(rèn)模式

db.users.find({i:90000}).explain("executionStats")

db.users.find({i:90000}).explain("allPlansExecution")

說(shuō)明:

queryPlanner模式下并不會(huì)去真正進(jìn)行query語(yǔ)句查詢,而是針對(duì)query語(yǔ)句進(jìn)行執(zhí)行計(jì)劃分析并選出winning plan。

repsetzhou:PRIMARY> db.users.find({i:9}).explain("queryPlanner")
{
    "queryPlanner" : {  #queryPlanner的返回
        "plannerVersion" : 1,
        "namespace" : "app_1.users",  #該值返回的是該query所查詢的表
        "indexFilterSet" : false, #針對(duì)該query是否有indexfilter
        "parsedQuery" : {
            "i" : {
                "$eq" : 9
            }
        },
        "winningPlan" : { #查詢優(yōu)化器針對(duì)該query所返回的最優(yōu)執(zhí)行計(jì)劃的詳細(xì)內(nèi)容
            "stage" : "FETCH", #最優(yōu)執(zhí)行計(jì)劃的stage,這里返回是FETCH,可以理解為通過(guò)返回的index位置去檢索具體的文檔
            "inputStage" : { # 用來(lái)描述子stage,并且為其父stage提供文檔和索引關(guān)鍵字
                "stage" : "IXSCAN", #queryPlanner.winningPlan.stage的child stage,此處是IXSCAN,表示進(jìn)行的是index scanning
                "keyPattern" : { #掃描的index內(nèi)容,此處是 "i" : 1
                    "i" : 1
                },
                "indexName" : "i_1", #winning plan所選用的index,使用db.users.getIndexes() 查看索引信息
                "isMultiKey" : false, #是否是Multikey,此處返回是false,如果索引建立在array上,此處將是true
                "isUnique" : false, #是否為唯一鍵
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward", #query的查詢順序,此處是forward
                "indexBounds" : {
                    "i" : [
                        "[9.0, 9.0]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ] #其他執(zhí)行計(jì)劃(非最優(yōu)而被查詢優(yōu)化器reject的)的詳細(xì)返回,具體信息與winningPlan的返回中意義相同
    },
    "serverInfo" : {   #server的一些信息
        "host" : "my1.ml.com",  #主機(jī)名字
        "port" : 27017,  #數(shù)據(jù)庫(kù)端口
        "version" : "3.2.13",  #數(shù)據(jù)庫(kù)版本
        "gitVersion" : "23899209cad60aaafe114f6aea6cb83025ff51bc"
    },
    "ok" : 1
}


executionStats分析:

repsetzhou:PRIMARY> db.users.find({i:9}).explain("executionStats")
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "app_1.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "i" : {
                "$eq" : 9
            }
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "i" : 1
                },
                "indexName" : "i_1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "i" : [
                        "[9.0, 9.0]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1,  #查詢返回的條目
        "executionTimeMillis" : 0,   #該query的整體查詢時(shí)間
        "totalKeysExamined" : 1, #索引掃描條目
        "totalDocsExamined" : 1, #文檔掃描條目

對(duì)于一個(gè)查詢來(lái)講,最理想的結(jié)果是:nReturned=totalKeysExamined=totalDocsExamined


        "executionStages" : {
            "stage" : "FETCH",  #此類型比較重要,如下列出可能的類型:

stage的類型:

   COLLSCAN:全表掃描

  IXSCAN:索引掃描

   FETCH:根據(jù)索引去檢索指定document

   SHARD_MERGE:將各個(gè)分片返回?cái)?shù)據(jù)進(jìn)行merge

   SORT:表明在內(nèi)存中進(jìn)行了排序

   LIMIT:使用limit限制返回?cái)?shù)

   SKIP:使用skip進(jìn)行跳過(guò)

   IDHACK:針對(duì)_id進(jìn)行查詢

   SHARDING_FILTER:通過(guò)mongos對(duì)分片數(shù)據(jù)進(jìn)行查詢

   COUNT:利用db.coll.explain().count()之類進(jìn)行count運(yùn)算

   COUNTSCAN:count不使用Index進(jìn)行count時(shí)的stage返回

   COUNT_SCAN:count使用了Index進(jìn)行count時(shí)的stage返回

   SUBPLA:未使用到索引的$or查詢的stage返回

   TEXT:使用全文索引進(jìn)行查詢時(shí)候的stage返回

   PROJECTION:限定返回字段時(shí)候stage的返回

   對(duì)于普通查詢,我希望看到stage的組合(查詢的時(shí)候盡可能用上索引):

   Fetch+IDHACK

   Fetch+ixscan

   Limit+(Fetch+ixscan)

   PROJECTION+ixscan

   SHARDING_FITER+ixscan

   COUNT_SCAN

   如下的stage效率比較低下:

   COLLSCAN(全表掃描),SORT(使用sort但是無(wú)index),不合理的SKIP,SUBPLA(未用到index的$or),COUNTSCAN(不使用index進(jìn)行count)


            "nReturned" : 1,
            "executionTimeMillisEstimate" : 0,   #該query查詢根據(jù)index去檢索document獲得1條數(shù)據(jù)的時(shí)間
            "works" : 2,
            "advanced" : 1,
            "needTime" : 0,
            "needYield" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "invalidates" : 0,
            "docsExamined" : 1,
            "alreadyHasObj" : 0,
            "inputStage" : {
                "stage" : "IXSCAN",
                "nReturned" : 1,
                "executionTimeMillisEstimate" : 0,  #該查詢掃描1行index所用時(shí)間
                "works" : 2,
                "advanced" : 1,
                "needTime" : 0,
                "needYield" : 0,
                "saveState" : 0,
                "restoreState" : 0,
                "isEOF" : 1,
                "invalidates" : 0,
                "keyPattern" : {
                    "i" : 1
                },
                "indexName" : "i_1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "i" : [
                        "[9.0, 9.0]"
                    ]
                },
                "keysExamined" : 1,
                "dupsTested" : 0,
                "dupsDropped" : 0,
                "seenInvalidated" : 0
            }
        }
    },
    "serverInfo" : {
        "host" : "my1.ml.com",
        "port" : 27017,
        "version" : "3.2.13",
        "gitVersion" : "23899209cad60aaafe114f6aea6cb83025ff51bc"
    },
    "ok" : 1
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站欄目:mongodb執(zhí)行計(jì)劃說(shuō)明-創(chuàng)新互聯(lián)
文章地址:http://bm7419.com/article34/igope.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)、用戶體驗(yàn)、網(wǎng)站收錄、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)