mongodb执行计划说明-创新互联

创建documents:

创新互联公司为企业级客户提高一站式互联网+设计服务,主要包括成都网站设计、成都做网站、app软件开发小程序开发、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 

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

创建索引:

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

执行计划:

mongodb 3 explain有三种模式

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

db.users.find({i:90000}).explain("queryPlanner") #explain的默认模式

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

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

说明:

queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan。

repsetzhou:PRIMARY> db.users.find({i:9}).explain("queryPlanner")
{
    "queryPlanner" : {  #queryPlanner的返回
        "plannerVersion" : 1,
        "namespace" : "app_1.users",  #该值返回的是该query所查询的表
        "indexFilterSet" : false, #针对该query是否有indexfilter
        "parsedQuery" : {
            "i" : {
                "$eq" : 9
            }
        },
        "winningPlan" : { #查询优化器针对该query所返回的最优执行计划的详细内容
            "stage" : "FETCH", #最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档
            "inputStage" : { # 用来描述子stage,并且为其父stage提供文档和索引关键字
                "stage" : "IXSCAN", #queryPlanner.winningPlan.stage的child stage,此处是IXSCAN,表示进行的是index scanning
                "keyPattern" : { #扫描的index内容,此处是 "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" : [ ] #其他执行计划(非最优而被查询优化器reject的)的详细返回,具体信息与winningPlan的返回中意义相同
    },
    "serverInfo" : {   #server的一些信息
        "host" : "my1.ml.com",  #主机名字
        "port" : 27017,  #数据库端口
        "version" : "3.2.13",  #数据库版本
        "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的整体查询时间
        "totalKeysExamined" : 1, #索引扫描条目
        "totalDocsExamined" : 1, #文档扫描条目

对于一个查询来讲,最理想的结果是:nReturned=totalKeysExamined=totalDocsExamined


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

stage的类型:

   COLLSCAN:全表扫描

  IXSCAN:索引扫描

   FETCH:根据索引去检索指定document

   SHARD_MERGE:将各个分片返回数据进行merge

   SORT:表明在内存中进行了排序

   LIMIT:使用limit限制返回数

   SKIP:使用skip进行跳过

   IDHACK:针对_id进行查询

   SHARDING_FILTER:通过mongos对分片数据进行查询

   COUNT:利用db.coll.explain().count()之类进行count运算

   COUNTSCAN:count不使用Index进行count时的stage返回

   COUNT_SCAN:count使用了Index进行count时的stage返回

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

   TEXT:使用全文索引进行查询时候的stage返回

   PROJECTION:限定返回字段时候stage的返回

   对于普通查询,我希望看到stage的组合(查询的时候尽可能用上索引):

   Fetch+IDHACK

   Fetch+ixscan

   Limit+(Fetch+ixscan)

   PROJECTION+ixscan

   SHARDING_FITER+ixscan

   COUNT_SCAN

   如下的stage效率比较低下:

   COLLSCAN(全表扫描),SORT(使用sort但是无index),不合理的SKIP,SUBPLA(未用到index的$or),COUNTSCAN(不使用index进行count)


            "nReturned" : 1,
            "executionTimeMillisEstimate" : 0,   #该query查询根据index去检索document获得1条数据的时间
            "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所用时间
                "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
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:mongodb执行计划说明-创新互联
文章URL:http://scyanting.com/article/igope.html