加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

mongodb 执行计划阐述

发布时间:2023-10-05 15:07:52 所属栏目:系统 来源:
导读:创建documents:

for (i=0;i<1000000;i++){

db.users.insert(

{

"i":i,

"username":"user"+i,

"age":Math.floor(Math.random()*120),

"create":new Date()

}

);

}

创建
创建documents:
 
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
 
}
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章