iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mongodb 执行计划说明
  • 765
分享到

mongodb 执行计划说明

2024-04-02 19:04:59 765人浏览 八月长安
摘要

创建documents:for (i=0;i<1000000;i++){db.users.insert({"i":i,"username":"user

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

您可能感兴趣的文档:

--结束END--

本文标题: mongodb 执行计划说明

本文链接: https://www.lsjlt.com/news/36345.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么进行Oracle 执行计划的说明
    这期内容当中小编将会给大家带来有关怎么进行Oracle 执行计划的说明,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果要分析某条SQL的性...
    99+
    2024-04-02
  • 怎么理解mongodb执行计划
    本篇内容介绍了“怎么理解mongodb执行计划”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!====Mon...
    99+
    2024-04-02
  • 执行计划-1:获取执行计划
    看懂执行计划是作为处理数据库性能问题的必备技能之一,接下来一系列的文章我 会告诉你怎么去做。 我们会从一些文章开始讨论几种获取执行计划的方法,并且评估不同来源的执行计划最适合哪种场景。 完成上述的内容后我...
    99+
    2024-04-02
  • MongoDB的查询计划与执行计划怎么配置
    MongoDB的查询计划和执行计划是由MongoDB的查询优化器和执行引擎自动处理的,通常情况下不需要手动配置。不过,你可以通过使用...
    99+
    2024-05-07
    MongoDB
  • MongoDB中怎么查看执行计划方法
    这期内容当中小编将会给大家带来有关MongoDB中怎么查看执行计划方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 > db.che...
    99+
    2024-04-02
  • oracle sqlprofile 固定执行计划,并迁移执行计划
    sqlprofile固定执行计划 模拟10g 执行计划迁移至11g oracle数据库中,11g库用10g的执行计划,这里是把hint 全盘扫描的执行计划迁移  --1.准备阶段&nb...
    99+
    2024-04-02
  • MongoDB干货系列2-MongoDB执行计划分析详解(3)
    MongoDB干货系列2-MongoDB执行计划分析详解(3) http://www.mongoing.com/eshu_explain3  ...
    99+
    2024-04-02
  • SQLServer的执行计划
    目录一、背景二、显示和保存执行计划三、显示估计的执行计划四、显示实际执行计划五、以 XML 格式保存执行计划六、比较和分析执行计划6.1、比较执行计划6.2、分析实际执行计划总结一、...
    99+
    2023-05-16
    SQL Server执行计划 SQL Server 执行计划
  • 执行计划绑定
    http://www.mamicode.com/info-detail-1943333.html 需要绑定SQL执行计划常见的几种情况: SQL执行计划突变,导致数据库性能下降,从历史执行计划找一个合理...
    99+
    2024-04-02
  • MySQL 5.7Explain执行计划
    小编给大家分享一下MySQL 5.7Explain执行计划,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目录1. 介绍2. Ex...
    99+
    2024-04-02
  • mysql如何执行计划
    小编给大家分享一下mysql如何执行计划,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!      ...
    99+
    2024-04-02
  • Oracle查询执行计划
    执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。...
    99+
    2023-04-03
    Oracle查询执行计划 Oracle执行计划查询
  • mongodb常见运维监控和执行计划有哪些
    本篇内容主要讲解“mongodb常见运维监控和执行计划有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mongodb常见运维监控和执行计划有哪些”吧!查询超...
    99+
    2024-04-02
  • Golang 的defer执行规则说明
    defer介绍 defer是golang的一个特色功能,被称为“延迟调用函数”。当外部函数返回后执行defer。类似于其他语言的 try… catch … finally… 中的fi...
    99+
    2024-04-02
  • mysql explain执行计划详解
    ...
    99+
    2024-04-02
  • MySQL执行计划解析(四)
    本文是对于MySQL执行计划的解析,主要解释了MySQL执行计划中的各个参数及含义。  十三、Extra 产生的值 存在六种情况: Using filesort、Using tempor...
    99+
    2024-04-02
  • mysql执行计划怎么看
    这篇文章主要介绍mysql执行计划怎么看,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql执行计划怎么看可以使用 explain + sql语句查看执行计划,代码如下...
    99+
    2024-04-02
  • mysql如何执行计划explain
    这篇文章给大家分享的是有关mysql如何执行计划explain的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引...
    99+
    2023-06-15
  • mysql执行计划怎么查
    在MySQL中,可以通过使用`EXPLAIN`关键字来查看查询语句的执行计划。执行以下步骤来查看MySQL执行计划:1. 在MySQ...
    99+
    2023-10-12
    mysql
  • plsql执行计划如何看
    在PL/SQL中,可以使用DBMS_XPLAN包的功能来查看SQL语句的执行计划。以下是一些常用的方法:1. 使用EXPLAIN P...
    99+
    2023-10-10
    plsql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作