MongoDB——explain执行计划详解
目录
- 一、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执行计划详解相关推荐
- MySQL 优化:Explain 执行计划详解
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...
- Explain执行计划详解
作者:IT王小二 博客:https://itwxe.com 一条查询 SQL 语句为什么会执行很慢?执行的时候走了什么索引?多表查询的时候 SQL 大体执行流程是怎么样的?Explain 执行计划详解 ...
- Explain 执行计划详解
什么是执行计划 我们往往通过慢查询日志,可以找到慢查询的sql具体是怎么写的.我们往往可以通过表的索引,执行引擎等等去自己判断sql为什么执行缓慢的原因.但是这明显不是高效的. 我们的MySQL中为我 ...
- MySQL高级 之 explain执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
- Mysql调优之explain执行计划详解
前言 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了 explai ...
- mysql和oracle执行计划_mysql explain执行计划详解
原文链接:https://www.cnblogs.com/xiaoboluo768/p/5400990.html mysql> explain select t1.kprq from p ...
- mysql 执行计划详解_mysql explain执行计划详解
备注:转载 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:si ...
- 【夯实Mysql基础】mysql explain执行计划详解
原文地址 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:sim ...
- MySQL — 优化之explain执行计划详解(转)
EXPLAIN简介 EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词即可,MYSQL会在查询上设置一个 ...
- mysql explain insert_MySQL之EXPLAIN 执行计划详解
explain 可以分析 select语句的执行,即 MySQL 的"执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好):| All | ind ...
最新文章
- 进程返回linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- 华为云服务器安装win10系统,云服务器可以安装win10吗
- 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba的企业级微服务敏捷开发系统架构
- 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程
- P3156 【深基15.例1】询问学号(20分)--python3实现
- python爬取网上文章_python 爬取微信文章
- python-day76--django-中间件
- windows 软链接_Linux 基础-软链接和硬链接区别
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
- Java的BIO,NIO和AIO的区别于演进
- 大学c语言机试是老师阅卷么,最近,我们找了一些老师聊了聊
- RocketMQ——顺序消费(代码)
- 有哪些产品适合做引流?什么样的产品才适合做引流款
- 人工智能的发展对生活有什么影响?
- 行通信比并行通信的速度更高
- linux系统旋转屏幕命令,Archlinux 实现屏幕旋转
- js复制功能,可粘贴到文档,粘贴栏(复制内容有格式)
- Docker学习笔记(2)--Docker常用命令
- 运放的防护,如何避免电气过载(ESO)
- linux监控工具等--zz
热门文章
- foxmai邮件服务器pop,常见pop和stmp服务器地址-foxmail6或outlook邮件管理
- 关于Microsoft Project默认开始时间错误问题
- 【硬件木马项目】第二篇:硬件木马检测方法的种类及原理
- oracle select into from 用法,sql select into用法
- Leetcode第二期Task01 链表 707. 设计链表 206.反转链表 203.移除链表 328.奇偶链表 234.回文链表 21.合并两个有序链表 019.删除链表的倒数第 N 个结点
- 有限元基础及ANSYS应用 - 第8节 - 梁系结构的ANSYS分析
- npm connect ETIMEDOUT 报错
- 大数据架构之-- Lambda架构
- 原生开发、H5开发和混合开发的区别
- matlab面板数据怎么求增长率的公式,环比增长率怎么算公式表格(教你如何计算同比增长率)...