资讯专栏INFORMATION COLUMN

高性能mongodb之执行计划

senntyou / 2537人阅读

我的专栏地址:我的segmentfault,欢迎浏览
一、执行计划介绍

MongoDB 3.0之后,explain的返回与使用方法与之前版本有了不少变化,介于3.0之后的优秀特色,本文仅针对MongoDB 3.0+的explain进行讨论。
现版本explain有三种模式,分别如下:

queryPlanner

executionStats

allPlansExecution

其中 queryPlanner 是现版本explain的默认模式,queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan。

举个执行计划的命令例子:
db.usertable.find({"w": 1}).explain("queryPlanner")


举个执行计划响应结果的例子:
{
    "queryPlanner":{
        "plannerVersion":1,
        "namespace":"game_db.game_user", #该值返回的是该query所查询的表
        "indexFilterSet":false, #是否应用了index filter
        "parsedQuery":{ #查询条件
            "w":{
                "$eq":1
            }
        },
        "winningPlan":{ #查询优化器针对该query所返回的最优执行计划的详细内容
            "stage":"FETCH", #最优执行计划的stage,这里返回是FETCH,可以理解为通过返回的index位置去检索具体的文档
            "inputStage":{ # #explain.queryPlanner.winningPlan.stage的child stage,此处是IXSCAN,表示进行的是index scanning。
                "stage":"IXSCAN", #索引查找
                "keyPattern":{ #所扫描的index内容,此处是w:1与n:1。
                    "w":1,
                    "n":1
                },
                "indexName":"w_1_n_1", #winning plan所选用的index。
                "isMultiKey":false, #本次查询是否使用了多键、复合索引
                "direction":"forward", #此query的查询顺序,此处是forward,如果用了.sort({w:-1})将显示backward。
                "indexBounds":{ #winningplan所扫描的索引范围,此处查询条件是w:1,使用的index是w与n的联合索引,故w是[1.0,1.0]而n没有指定在查询条件中,故是[MinKey,MaxKey]。
                    "w":[
                        "[1.0, 1.0]"
                    ],
                    "n":[
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans":[ #其他执行计划(非最优而被查询优化器reject的)的详细返回,其中具体信息与winningPlan的返回中意义相同,故不在此赘述。
            {
                "stage":"FETCH",
                "inputStage":{
                    "stage":"IXSCAN",
                    "keyPattern":{
                        "w":1,
                        "v":1
                    },
                    "indexName":"w_1_v_1",
                    "isMultiKey":false,
                    "direction":"forward",
                    "indexBounds":{
                        "w":[
                            "[1.0, 1.0]"
                        ],
                        "v":[
                            "[MinKey, MaxKey]"
                        ]
                    }
                }
            }
        ]
      },
    "serverInfo" : {
            "host" : "ALI-SZ-VT-TEST001",
            "port" : 27017,
            "version" : "4.0.5",
            "gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412"
      },
      "ok" : 1
}
二、queryPlanner学习 2.1 Stage的意义

explain.queryPlanner.winningPlan.stageexplain.queryPlanner.winningPlan.inputStage**等。

stage/inputStage值 值的意义
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
SHARD_MERGE 将各个分片返回数据进行merge
SORT 表明在内存中进行了排序(与老版本的scanAndOrder:true一致)
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的返回
2.2一个stage/inputStage的特点

执行一:

db.usertable.find({"field0": "use"}).explain("queryPlanner")
{
      ...
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "field0" : {
                    "$eq" : "use"
                }
            },
            "direction" : "forward"
        },
        ...
}

执行二:

db.usertable.find({"field0": "use"}).limit(1).explain("queryPlanner")
{
    ...
        "winningPlan" : {
            "stage" : "LIMIT",
            "limitAmount" : 1,
            "inputStage" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "field0" : {
                        "$eq" : "use"
                    }
                },
                "direction" : "forward"
            }
        },
        ...
}

执行二在执行一的基础上增加了 limit限掉, queryPlanner由 stage(COLLSCAN) 变成了 stage(LIMIT)、inputStage.stage(COLLSCAN)。说明在判断queryPlanner是否达到用户想要的效果要对 stageinputStage.stag综合考虑。

参考文章:

MongoDB干货系列2-MongoDB执行计划分析详解 http://www.mongoing.com/eshu_explain2
官方文档: https://docs.mongodb.com/manual/tutorial/analyze-query-plan/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19476.html

相关文章

  • 性能mongodb应用程序跑执行计划

    摘要:执行计划之前发了一篇关于执行计划的说明。利用执行计划,我们可以判断每一次的执行情况和给出的执行建议。在中跑执行计划的命令,举个例子执行计划的模式为三种。程序中跑执行计划我使用的是库用的是。响应结果会有执行时间扫描记录数等真实的执行情况。 执行计划 之前发了一篇关于mongodb执行计划的说明。利用执行计划,我们可以判断每一次sql的执行情况和mongodb给出的执行建议。在mongo ...

    derek_334892 评论0 收藏0
  • 开源|性能优化利器:数据库审核平台Themis的选型与实践

    摘要:正是存在问题,促使我们考虑引入数据库审核平台。的确,与很多互联网公司相比,数据库数十套的估摸并不是太大但与互联网类公司不同,类似宜信这类金融类公司对数据库的依赖性更大,大量的应用是重数据库类的,且其使用复杂程度也远比互联网类的复杂。 作者:韩锋 出处:DBAplus社群分享 Themis开源地址:https://github.com/CreditEaseDBA 拓展阅读:宜信开源|数...

    wenhai.he 评论0 收藏0
  • MongoDB查看执行计划

    摘要:整体来说,通过查看执行计划,分析查询性能情况,可以帮助我们更好的分析和优化,必要的时候可以创建索引,提升查询性能。 一、概述 MongoDB中的explain()函数可以帮助我们查看查询相关的信息,查询分析可以确保我们创建的索引是否有效,是查询语句性能分析的重要工具。 二、explain()基本用法 explain()的用法是必须放在最后面,语法如下: db.collecton.fin...

    mdluo 评论0 收藏0
  • UCloud MongoDB 如何应对高考填志愿的上亿流量高峰

    摘要:优志愿张海鹏宋体背景宋体每年月下旬到月下旬期间是高考填志愿的高峰期,也是优志愿后端面临大流量高并发请求的业务高峰期。对于优志愿读多写少的场景及其业务高峰期,用户可以按需增删节点,更好地实现读取性能的扩展。 随着用户规模的增长,数据库的压力也在成倍增加。面对大流量、高并发,UCloud MongoDB 做到了高效,并展现出了更好的性能体验。 —— 优志愿 CTO 张海鹏 背景...

    cppprimer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<