目录

  • 一、explain执行计划使用的前提条件
  • 二、explain执行计划的语法
  • 三、explain执行计划的示例
    • 3.1、数据准备
    • 3.2、执行explain执行计划指定queryPlanner参数
    • 3.3、执行explain执行计划指定executionStats参数
    • 3.4、执行explain执行计划指定allPlansExecution参数
    • 3.5、 stage状态
    • 3.6、执行计划的返回结果中尽量不要出现以下stage

一、explain执行计划使用的前提条件

  • 查询是否使用了索引
  • 索引是否减少了扫描的记录数量
  • 是否存在低效的内存排序

二、explain执行计划的语法

  • explain()方法的形式

    db.collection.find().explain(<verbose>)
    
  • verbose 可选参数
    表示执行计划的输出模式,默认queryPlanner

    模式名字 描述
    queryPlanner 执行计划的详细信息,包括查询计划、集合信息、查询条件、最佳执行计划、查询方式和 MongoDB 服务信息等
    exectionStats 最佳执行计划的执行情况和被拒绝的计划等信息
    allPlansExecution 选择并执行最佳执行计划,并返回最佳执行计划和其他执行计划的执行情况

三、explain执行计划的示例

3.1、数据准备

  • 准备数据集,执行脚本

    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++){var typeIdx = Math.floor(Math.random()*types.length);var tagIdx = Math.floor(Math.random()*tags.length);var tagIdx2 = Math.floor(Math.random()*tags.length);var favCount = Math.floor(Math.random()*100);var username = "xx00"+Math.floor(Math.random()*10);var age = 20 + Math.floor(Math.random()*15);var book = {title: "book-"+i, type: types[typeIdx],tag: [tags[tagIdx],tags[tagIdx2]],favCount: favCount, author: {name:username,age:age}};books.push(book)
    }
    db.books1.insertMany(books);
    

  • 查看初始化的数据

    db.books1.find()
    

3.2、执行explain执行计划指定queryPlanner参数

  • 未创建title的索引,执行explain指定queryPlanner参数

    db.books1.find({title:"book-1"}).explain("queryPlanner")
    

  • explain执行中字段的解释

    字段名称 描述
    plannerVersion 执行计划的版本
    namespace 查询的集合
    indexFilterSet 是否使用索引
    parsedQuery 查询条件
    winningPlan 最佳执行计划
    stage 查询方式
    filter 过滤条件
    direction 查询顺序
    rejectedPlans 拒绝的执行计划
    serverInfo mongodb服务器信息

3.3、执行explain执行计划指定executionStats参数

  • executionStats 模式的返回信息中包含了 queryPlanner 模式的所有字段,并且还包含了最佳执行计划的执行情况

  • 创建title索引

    db.books1.createIndex({title:1})
    

  • 执行explain指定executionStats参数

    db.books1.find({title:"book-1"}).explain("executionStats")
    



  • explain执行中字段的解释

    字段名称 描述
    winningPlan.inputStage 用来描述子stage,并且为其父stage提供文档和索引关键字
    winningPlan.inputStage.stage 子查询方式
    winningPlan.inputStage.keyPattern 所扫描的index内容
    winningPlan.inputStage.indexName 索引名
    winningPlan.inputStage.isMultiKey 是否是Multikey。如果索引建立在array上,将是true
    executionStats.executionSuccess 是否执行成功
    executionStats.nReturned 返回的个数
    executionStats.executionTimeMillis 这条语句执行时间
    executionStats.executionStages.executionTimeMillisEstimate 检索文档获取数据的时间
    executionStats.executionStages.inputStage.executionTimeMillisEstimate 扫描获取数据的时间
    executionStats.totalKeysExamined 索引扫描次数
    executionStats.executionStages.isEOF 是否到达 steam 结尾,1 或者 true 代表已到达结尾
    executionStats.executionStages.works 工作单元数,一个查询会分解成小的工作单元
    executionStats.executionStages.advanced 优先返回的结果数
    executionStats.executionStages.docsExamined 文档检查数

3.4、执行explain执行计划指定allPlansExecution参数

  • allPlansExecution返回的信息包含 executionStats 模式的内容,且包含allPlansExecution:[]块

    "allPlansExecution" : [{"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,"totalKeysExamined" : <int>,"totalDocsExamined" :<int>,"executionStages" : {"stage" : <STAGEA>,"nReturned" : <int>,"executionTimeMillisEstimate" : <int>,...}}},...
    ]
    

3.5、 stage状态

状态 描述
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引检索指定文档
SHARD_MERGE 将各个分片返回数据进行合并
SORT 在内存中进行了排序
LIMIT 使用limit限制返回数
SKIP 使用skip进行跳过
IDHACK 对_id进行查询
SHARDING_FILTER 通过mongos对分片数据进行查询
COUNTSCAN count不使用Index进行count时的stage返回
COUNT_SCAN count使用了Index进行count时的stage返回
SUBPLA 未使用到索引的$or查询的stage返回
TEXT 使用全文索引进行查询时候的stage返回
PROJECTION 限定返回字段时候stage的返回

3.6、执行计划的返回结果中尽量不要出现以下stage

  • COLLSCAN(全表扫描)
  • SORT(使用sort但是无index)
  • 不合理的SKIP
  • SUBPLA(未用到index的$or)
  • COUNTSCAN(不使用index进行count)

MongoDB——explain执行计划详解相关推荐

  1. MySQL 优化:Explain 执行计划详解

    昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...

  2. Explain执行计划详解

    作者:IT王小二 博客:https://itwxe.com 一条查询 SQL 语句为什么会执行很慢?执行的时候走了什么索引?多表查询的时候 SQL 大体执行流程是怎么样的?Explain 执行计划详解 ...

  3. Explain 执行计划详解

    什么是执行计划 我们往往通过慢查询日志,可以找到慢查询的sql具体是怎么写的.我们往往可以通过表的索引,执行引擎等等去自己判断sql为什么执行缓慢的原因.但是这明显不是高效的. 我们的MySQL中为我 ...

  4. MySQL高级 之 explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  5. Mysql调优之explain执行计划详解

    前言 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了 explai ...

  6. mysql和oracle执行计划_mysql explain执行计划详解

    原文链接:https://www.cnblogs.com/xiaoboluo768/p/5400990.html mysql> explain  select t1.kprq from    p ...

  7. mysql 执行计划详解_mysql explain执行计划详解

    备注:转载 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:si ...

  8. 【夯实Mysql基础】mysql explain执行计划详解

    原文地址 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:sim ...

  9. MySQL — 优化之explain执行计划详解(转)

    EXPLAIN简介 EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个 ...

  10. mysql explain insert_MySQL之EXPLAIN 执行计划详解

    explain 可以分析 select语句的执行,即 MySQL 的"执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好):| All | ind ...

最新文章

  1. 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
  2. 华为云服务器安装win10系统,云服务器可以安装win10吗
  3. 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba的企业级微服务敏捷开发系统架构
  4. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程
  5. P3156 【深基15.例1】询问学号(20分)--python3实现
  6. python爬取网上文章_python 爬取微信文章
  7. python-day76--django-中间件
  8. windows 软链接_Linux 基础-软链接和硬链接区别
  9. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
  10. Java的BIO,NIO和AIO的区别于演进
  11. 大学c语言机试是老师阅卷么,最近,我们找了一些老师聊了聊
  12. RocketMQ——顺序消费(代码)
  13. 有哪些产品适合做引流?什么样的产品才适合做引流款
  14. 人工智能的发展对生活有什么影响?
  15. 行通信比并行通信的速度更高
  16. linux系统旋转屏幕命令,Archlinux 实现屏幕旋转
  17. js复制功能,可粘贴到文档,粘贴栏(复制内容有格式)
  18. Docker学习笔记(2)--Docker常用命令
  19. 运放的防护,如何避免电气过载(ESO)
  20. linux监控工具等--zz

热门文章

  1. foxmai邮件服务器pop,常见pop和stmp服务器地址-foxmail6或outlook邮件管理
  2. 关于Microsoft Project默认开始时间错误问题
  3. 【硬件木马项目】第二篇:硬件木马检测方法的种类及原理
  4. oracle select into from 用法,sql select into用法
  5. Leetcode第二期Task01 链表 707. 设计链表 206.反转链表 203.移除链表 328.奇偶链表 234.回文链表 21.合并两个有序链表 019.删除链表的倒数第 N 个结点
  6. 有限元基础及ANSYS应用 - 第8节 - 梁系结构的ANSYS分析
  7. npm connect ETIMEDOUT 报错
  8. 大数据架构之-- Lambda架构
  9. 原生开发、H5开发和混合开发的区别
  10. matlab面板数据怎么求增长率的公式,环比增长率怎么算公式表格(教你如何计算同比增长率)...