SQL explain解析器

news2025/1/20 3:42:22

EXPLAIN 参数

  • 前言
  • 字段参数
    • id 查询编号
    • select_type 关联类型
      • SIMPLE
      • PRIMARY
      • UNION & UNION RESULT
      • DERIVED
      • SUBQUERY
      • DEPENDENT
      • UNCACHEABLE
      • MATERIALIZED
    • table 表名
    • partitions 数据的分区信息
    • type 关联类型
      • system & const
      • eq_ref
      • ref
      • fulltext
      • ref_or_null
      • index_merge
      • unique_subquery
      • index_subquery
      • range
      • index
      • ALL
    • possible_keys 可使用索引
    • key 实际使用索引
    • key_len 索引字段的可能最大长度
    • ref 实际使用列或常量
    • rows 执行结果行数
    • filtered 符合条件的记录数百分比
    • Extra 解析后的附加信息
      • Using index
      • Using index condition
      • Using temporary
      • Using filesort
      • Using where
      • Zero limit
      • Using sort_union(), Using union(), sing intersect()

前言

explain所有人都应该很熟悉,通过它可以知道SQL是如何执行的,虽然不是100%管用,但是至少大多数场景通过explain的输出结果能直观的看到执行计划的相关信息。

早一些的版本explain还只能查看select语句,现在已经能支持deleteupdateinsertreplace了。

字段参数

id 查询编号

查询编号,如果没有子查询或者联合查询的话,就只有一条,如果是联合查询的话,那么会出现一条id为null的记录,并且标志查询结果,因为union结果会放到临时表中,所以我们看到这里的表名是<union1,2>这种格式。
在这里插入图片描述

select_type 关联类型

关联类型,决定访问表的方式。

类型描述
SIMPLE简单select(不使用union或子查询)
PRIMARY最外层的select
UNIONUnion中第二个或之后的select语句
UNION RESULTUNION的结果,union语句中第二个select开始后面所有select
DEPENDENT UNIONUnion中第二个或之后的select语句取决于外面的查询
SUBQUERY子查询中的第一个SELECT,结果不依赖于外部查询
DERIVED派生表的SELECT, FROM子句的子查询
Materialized物化子查询
DEPENDENT SUBQUERY结果集无法缓存的子查询,必须重新评估外部查询的每一行
UNCACHEABLE UNIONUnion中的第二个或之后的select,属于无法缓存的子查询

SIMPLE

简单查询,代表没有子查询或者union

PRIMARY

如果不是简单查询,那么最外层查询就会被标记成PRIMARY。

UNION & UNION RESULT

从上图可以看出来了,包含联合查询,第一个被标记成了PRIMARYunion之后的查询被标记成UNION,以及最后产生的UNION RESULT

DERIVED

用来标记出现在from里的子查询,这个结果会放入临时表中,也叫做派生表。
在这里插入图片描述
对于低版本的Mysql显示如上图,高一点可能看到的还是PRIMARY,因为被Mysql优化了。下面换一个版本的Mysql和SQL执行可以验证到这个结果。
在这里插入图片描述

SUBQUERY

不在from里的子查询。
在这里插入图片描述

DEPENDENT

代表关联子查询(子查询使用了外部查询包含的列),和UNIONSUBQUERY组合产生不同的结果。
在这里插入图片描述

UNCACHEABLE

代表不能缓存的子查询,也可以和UNIONSUBQUERY组合产生不同的结果。
在这里插入图片描述

MATERIALIZED

物化子查询是Mysql对子查询的优化,第一次执行子查询时会将结果保存到临时表,物化子查询只需要执行一次。

比如上述DERIVED就是物化的一种体现,与之对应的就是DEPENDENT,每次子查询都需要重新调用。

这个结果无法直观的看出来,可以用FORMAT=JSON命令查看materialized_from_subquery字段。
在这里插入图片描述

table 表名

显示表名,从上述的一些图中可以观察到UNION_RESULT和DERIVED显示的表名都有一些自己的命名规则。

比如UNION_RESULT产生的是<unionM,N>,DERIVED产生的是。

partitions 数据的分区信息

数据的分区信息,没有分区忽略就好了。

type 关联类型

关联类型,决定通过什么方式找到每一行数据。以下按照速度由快到慢。

优先级类型描述
1system只有一条数据的系统表
2const主键或者唯一索引查询,最终常量查询
3eq_ref主键或者唯一索引,最多返回一条数据
4ref最左前缀匹配,非主键和唯一索引查询,返回多条数据
5fulltextFULLTEXT索引
6ref_or_nulref的特殊情况,还有 is null 多进行一次查找
7index_merge索引合并
8unique_subquery和eq_ref类似,in(select pk)特殊场景出现
9index_subquery非唯一索引的unque_subquery
10range范围查询
11index和ALL类似,只是按照索引顺序扫表
12ALL全表扫描

system > const > eq_ref > ref > fulltext > ref_or_nul l> index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref

system & const

通常是最快的查找方式,代表Mysql通过优化最终转换成常量查询,最常规的做法就是直接通过主键或者唯一索引查询。
在这里插入图片描述
system是const的一个特例(只有一行数据的系统表),随便找一张系统表,就插入一条数据就可以看到system了。
在这里插入图片描述

eq_ref

通常通过主键索引或者唯一索引查询时会看到eq_ref,它最多只返回一条数据。user_id是唯一索引,为了测试就关联以下主键索引。
在这里插入图片描述

ref

通过索引查找,但是和eq_ref不同,ref可能匹配到多条符合条件的数据,比如最左前缀匹配或者不是主键和唯一索引。
在这里插入图片描述

fulltext

使用FULLTEXT索引

ref_or_null

和ref类似,但是还要进行一次查询找到NULL的数据。

这相当于是对于IS NULL查询的优化,如果表数据量太少的话,或许能看到这里类型是全表扫描。
在这里插入图片描述

index_merge

索引合并是在Mysql5.1之后引入的,就像下面的一个OR查询,按照原来的想法要么用name的索引,要么就是用age的索引,有了索引合并就不一样了。

对于这种单表查询(无法跨表合并)用到了多个索引的情况,每个索引都可能返回一个结果,Mysql会对结果进行取并集、交集,这就是索引合并了。
在这里插入图片描述

unique_subquery

按照官方文档所说,unique_subquery只是eq_ref的一个特例,对于下图中这种 in 的语句查询会出现以提高查询效率。

由于Mysql会对select进行优化,基本无法出现这个场景,只能用update这种语句了。
在这里插入图片描述

index_subquery

和unique_subquery类似,只是针对的是非唯一索引。
在这里插入图片描述

range

范围查询,其实就是带有限制条件的索引扫描。

常见的范围查询比如between and,>,<,like,in 都有可能出现range
在这里插入图片描述

index

跟全表扫描类似,只是扫表是按照索引顺序进行。

ALL

全表扫描,没啥好说的。

possible_keys 可使用索引

可以使用哪些索引。

key 实际使用索引

实际决定使用哪个索引。

key_len 索引字段的可能最大长度

索引字段的可能最大长度,不是表中实际数据使用的长度。

ref 实际使用列或常量

表示key展示的索引实际使用的列或者常量。

rows 执行结果行数

查询数据需要读取的行数,只是一个预估的数值,但是能很直观的看出SQL的优劣了。

filtered 符合条件的记录数百分比

5.1版本之后新增字段,表示针对符合查询条件的记录数的百分比估算,用rows和filtered相乘可以计算出关联表的行数。

Extra 解析后的附加信息

解析查询的附加额外信息,这个太多了,有兴趣可以自己看官方文档,列举一些常见的:

Using index

使用覆盖索引。

Using index condition

使用索引下推,索引下推简单来说就是加上了条件筛选,减少了回表的操作。
在这里插入图片描述

Using temporary

排序使用了临时表。

Using filesort

使用外部索引文件排序,但是不能从这里看出是内存还是磁盘排序,我们只能知道更消耗性能。

Using where

where过滤。

Zero limit

除非你写个LIMIT 0。

Using sort_union(), Using union(), sing intersect()

使用了索引合并。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

必备表格软件-FineReport正则表达式简介

1. 概述 1.1 应用场景 有时候我们需要用到正则表达式进行信息的校验。 例如有一张使用了「文本控件」的查询报表&#xff0c;输入「销售员」姓名后可查询销售员的销售情况&#xff0c;此时希望设置销售员文本控件的填入信息校验内容为&#xff1a;若填入内容不是中文或中文的…

【无标题】接口测试用例设计(精华)

接口测试 请求头 请求头中的Content-Type有哪几种&#xff1a; 1.application/x-www-form-urlencoded 最常见的 POST 提交数据的方式&#xff0c;原生Form表单&#xff0c;如果不设置 enctype 属性&#xff0c;默认为application/x-www-form-urlencoded 方式提交数据。 2.appli…

Node.js 入门教程 19 package-lock.json 文件

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程19 package-lock.json 文件19.1 示例19 package-lock.json 文件 在版本 5 中&#xff0c;npm 引入了 package-lock.json 文…

BUUCTF Reverse/[2019红帽杯]xx

BUUCTF Reverse/[2019红帽杯]xx 先看下文件信息&#xff1a;没有加壳、64位程序 看别人wp时候发现个好东东,就是这个findcrypt插件&#xff0c;可以看加密算法的&#xff0c;具体安装可以看这个IDA7.5安装findcrypt3插件 可以看到这是tea加密 先一点点分析代码&#xff0c;输入…

48.标准输入输出流

标准输入流对象cin&#xff0c;重点掌握的函数&#xff1a; 1.cin.get() //一次只能读取一个字符 2.cin.get(一个参数) //读一个字符 3.cin.get(两个参数) //可以读字符串 这种情况下不会读取换行符&#xff0c;换行符始终留在缓冲区当中 4.cin.getline() 此函数在读取数据的…

跳出打工圈!程序员要如何走上创业逆袭路,获得财富自由

前言 采访了一位创业人物&#xff0c;创业即是人生&#xff0c;生命精彩待续 人生的每一种经历都是一门功课&#xff0c;我们无法跳跃过去&#xff0c;所以必须要逐个地去完成它。无论遇到什么样的困难&#xff0c;自己想通了、走出来了&#xff0c;才会有不一样的自己。 大…

rt-thread通过spi连接W25Q32后无法读取ID

注意&#xff0c;cs引脚必须由rtt控制&#xff0c;但是我这个cs引脚用的是PA15&#xff0c;它默认是jlink的引脚&#xff0c;所以首先要将jlink禁用&#xff0c;如下&#xff1a; rcu_periph_clock_enable(RCU_AF);rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable…

开课通知 | 《AISHELL-3语音合成实战》课程

语音合成技术 在多个智能语音技术的学习方向中&#xff0c;语音合成又称文本转换&#xff08;Text To Speech, 简称TTS&#xff09;即将文字信息转换成为人类可以听得懂、流利的语音技术。在人机语音交互系统中&#xff0c;语音合成作为最后机器将内容转化为语音的输出环节&…

线程可重复使用,程序开发是如何使用线程池的呢?

大家都知道多线程开发对于程序开发的重要性&#xff0c;今天大连九哥来给大家聊一聊线程池的使用过程。 一、为什么要使用线程池&#xff1f; 大家都知道java支持多线程开发&#xff0c;也就是支持多个任务并行运行&#xff0c;我们也知道线程的生命周期中包括创建、就绪、运…

maltose-Transferrin 麦芽糖-转铁蛋白

maltose-Transferrin 麦芽糖-转铁蛋白 中文名称&#xff1a;麦芽糖-转铁蛋白 英文名称&#xff1a;maltose-Transferrin 别称&#xff1a;转铁蛋白修饰麦芽糖&#xff0c;Tf-麦芽糖 可以提供PEG接枝修饰麦芽糖&#xff0c;麦芽糖-聚乙二醇-转铁蛋白,Transferrin-PEG-maltos…

17.Http__Linux

目录 1.为什么要学Linux 2.我们要学什么 3.Linux命令操作 1.常用快捷键&#xff1a; 2.文件的操作 4.管道pipe 5.重定向redirect 5.查看系统指标&#xff08;任务管理器&#xff09; 7.安装软件(maven、包) 8.部署博客系统 1.首先对tomcat进行安装和调配 HTTPS:出现…

山西青年杂志山西青年杂志社山西青年编辑部2022年第22期目录

本刊专稿《山西青年》投稿&#xff1a;cn7kantougao163.com 基于学生激励机制的考核方案研究 聂晶晶; 1-4 当前我国大学生网络心理障碍分析及引导机制研究 陈宁;王佳玮; 5-8 教育教学研究 百万扩招背景下高职院校“三教”改革探究 郭庆秋; 9-11 “百万扩招”背…

linux统计目录文件数量

1、当前文件夹及子文件夹的数量&#xff1a; ls -lR | grep "^d" | wc -l 2、当前文件及子目录文件夹的数量&#xff1a; ls -lR | grep "^-" | wc -l 3、当前目录某文件的数量&#xff1a; find . -name filename | wc -l 4、当前目录所有目录和文件罗…

SpringCloud服务治理介绍Nacos安装及实现负载均衡

目录 一、服务治理简介 二、nacos简介 三、nacos下载&安装 四、nacos实现负载均衡 一、服务治理简介 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中…

基于PHP+MySQL大连真爱果汁厂管理系统的设计与实现

果汁是以水果为原料经过物理方法如压榨、离心、萃取等得到的汁液产品。长期的饮用果汁不仅可以让我们大饱口福而且能够增加免疫力,减少生病,延缓衰老,甚至一些果汁还有美容养颜的功效,果汁中富含多种矿物质和有机酸为此深受各类人群的喜欢,随着人们健康意识的增加,人们对果汁的…

双十二投影仪推荐 三分钟告诉你怎么挑选到称心如意的投影仪

作为家庭沉浸式观影的必备神器&#xff0c;投影仪越来越受大众的喜爱&#xff0c;今天就让我们一起来看看双十二投影仪推荐&#xff0c;双十二高性价比投影仪选购指南&#xff0c;双十二卧室投影怎么选&#xff1f;2022双十二热门投影仪推荐&#xff0c;这8款投影仪总有一款适合…

华为云会议,轻松实现远程智能办公

说到云会议&#xff0c;很多人首先想到的应该就是华为云会议&#xff01;华为云会议基于华为近30年的音视频技术&#xff0c;结合华为IdeaHub等全系列智能协作终端&#xff0c;为客户提供全场景端云协同视频会议解决方案&#xff0c;满足跨地区、跨企业、跨终端的智能沟通协作需…

聚L-精氨酸/纳米金/石墨烯/聚苯胺复合膜/铝粉/稀土粒子修饰多巴胺的制备

小编这里给大家分享的科研内容是聚L-精氨酸/纳米金/石墨烯/聚苯胺复合膜/铝粉/稀土粒子修饰多巴胺的制备&#xff0c;和小编一起来看! 聚L-精氨酸/纳米金修饰多巴胺的制备&#xff1a; 利用多电位脉冲沉积法制备纳米金修饰电极 (AuNPs/GCE),再将L-精氨酸电聚合在AuNPs/GCE表面…

Kotlin高仿微信-项目实践58篇

Kotlin高仿微信项目实践主要包含5大模块&#xff1a; 1、Web服务器 2、Kotlin客户端 3、Xmpp即时通讯服务器 4、视频通话服务器 5、腾讯云服务器 另外也有Flutter版本高仿微信功能&#xff0c;Flutter版本跟Kotlin同时开发&#xff0c;调用的是同一个服务器接口。 每天只…

【原创】关于表结构更改的大量数据的迁移方案

前言 由于公司要求做产品之间的对接&#xff0c;需要统一表结构和字段名&#xff0c;但是有些表有上亿条数据&#xff0c;如果直接修改表字段名和加字段每一条SQL都要执行大量时间&#xff0c;大概时间为加一个字段1.5小时/1亿条数据&#xff0c;这耗时实在太长了&#xff0c;…