资讯专栏INFORMATION COLUMN

MongoDB查看执行计划

mdluo / 365人阅读

摘要:整体来说,通过查看执行计划,分析查询性能情况,可以帮助我们更好的分析和优化,必要的时候可以创建索引,提升查询性能。

一、概述

MongoDB中的explain()函数可以帮助我们查看查询相关的信息,查询分析可以确保我们创建的索引是否有效,是查询语句性能分析的重要工具。

二、explain()基本用法

explain()的用法是必须放在最后面,语法如下:

db.collecton.find({x:1}).explain()

explain()常用是直接跟在find()函数后面,表示查看find()函数的执行计划,举例:

MongoDB Enterprise mongos> db.emp.find({"id":{$lt:1000}}).explain()
{
    "queryPlanner" : {
                    serverInfo" : {
                        "host" : "mongotest1",
                        "port" : 27021,
                        "version" : "3.2.8",
                        "gitVersion" : "ed70e33130c977bda0024c125b56d159573dbaf0"
                    },
                    "plannerVersion" : 1,
                    "namespace" : "testdb.emp",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "id" : {
                            "$lt" : 1000
                        }
                    },
                       winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "SHARDING_FILTER",
                            "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                    "id" : 1
                                },
                                "indexName" : "id_1",
                                "direction" : "forward",
                            },
                    "rejectedPlans" : [ ]
   },
   "ok" : 1
}

参数说明:

以上我们看到的是explain()默认参数的情况,其实MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,

3.0+版本的explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。常用的是queryPlanner和executionStats模式

那我们再来看看executionStats这种模式

MongoDB Enterprise mongos> db.emp.find({"id":{$lt:1000}}).explain("executionStats")
{
    "queryPlanner" : {
        "mongosPlannerVersion" : 1,
        "winningPlan" : {
            "stage" : "SHARD_MERGE",
                  },
                  "rejectedPlans" : [ ]
    },
   "executionStats" : {
        "nReturned" : 999,
        "executionTimeMillis" : 35,
        "totalKeysExamined" : 999,
        "totalDocsExamined" : 999,
        "executionStages" : {
            "stage" : "SHARD_MERGE",
            "nReturned" : 999,
            "executionTimeMillis" : 35,
            "totalKeysExamined" : 999,
            "totalDocsExamined" : 999,
            "totalChildMillis" : NumberLong(33),
            "shards" : [
                {
                    "shardName" : "shard1",
                    "executionSuccess" : true,
                    "executionStages" : {
                        "stage" : "FETCH",
                        "nReturned" : 980,
                        "executionTimeMillisEstimate" : 30,
                        "works" : 981,
                        "advanced" : 980,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 7,
                        "restoreState" : 7,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "docsExamined" : 980,
                        "alreadyHasObj" : 0
    },
    "ok" : 1
}

executionStats的参数说明:


在此看来,executionStats这种模式比默认的queryPlanner给出来个更多的可参考的信息,

另外一种模式allPlansExecution是用来获取所有执行计划,参数基本与以上的相同,这里就不再详细说明。

三、总结

原来explain()也是可以接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。

queryPlanner:查询计划的选择器,首先进行查询分析,最终选择一个winningPlan,是explain返回的默认模式

executionStats:为执行统计模式,返回winningPlan的统计结果

allPlansExecution:为返回所有执行计划的统计,包括rejectedPlan

所以:我们在查询优化的时候,只需要关注queryPlanner, executionStats即可,因为queryPlanner为我们选择出了winningPlan, 而executionStats为我们统计了winningPlan的所有关键数据。

整体来说,通过explain()查看执行计划,分析查询性能情况,可以帮助我们更好的分析和优化,必要的时候可以创建索引,提升查询性能。

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

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

相关文章

  • UCloud MongoDB 如何应对高考填志愿的上亿流量高峰

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

    cppprimer 评论0 收藏0
  • MongoDB指南---12、使用explain()和hint()、何时不应该使用索引

    摘要:表示本次查询使用了索引,具体来说,是使用了和上的索引,。建立索引时,或者是每执行次查询之后,查询优化器都会重新评估查询计划。上一篇文章指南使用复合索引操作符如何使用索引索引对象和数组索引基数下一篇文章指南索引类型 上一篇文章:MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数下一篇文章:MongoDB指南---13、索引类型 使用explain...

    LiangJ 评论0 收藏0
  • MongoDB指南---12、使用explain()和hint()、何时不应该使用索引

    摘要:表示本次查询使用了索引,具体来说,是使用了和上的索引,。建立索引时,或者是每执行次查询之后,查询优化器都会重新评估查询计划。上一篇文章指南使用复合索引操作符如何使用索引索引对象和数组索引基数下一篇文章指南索引类型 上一篇文章:MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数下一篇文章:MongoDB指南---13、索引类型 使用explain...

    DTeam 评论0 收藏0
  • 深入解析 MongoDB Plan Cache

    摘要:所以在扫描次后,率先到达状态,那么此刻将停止扫描,进入到算分的阶段。除了这条引发故障的之外,其他的字段命中索引数量都非常小,有的甚至只有一条。那这里很明显在中只去根据中执行计划的相关索引来进行判断是不合理的。 前段时间笔者遇到一个MongoBD Plan Cache的bug,于是深究了下MongoDB优化器相关源码。在这里分享给大家,一方面让大家知道MongoDB优化器工作原理,一方面...

    Pluser 评论0 收藏0

发表评论

0条评论

mdluo

|高级讲师

TA的文章

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