文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mongodb 执行计划说明

2024-04-02 19:55

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯