首页 > 其他分享 >explain详解

explain详解

时间:2022-08-30 15:14:55浏览次数:49  
标签:const UNION explain 查询 索引 详解 ref

explain用法

mysql中explain有两种用法,一种是explain table_name用来查看表结构信息,另一种就是explain select....用来查询sql执行计划,分析sql性能。

  • 查看表结构

 

  • 查询sql执行计划

 

 其中查看表结构没什么复杂内容,在此不过多介绍,下面主要介绍查询sql执行计划的功能。

查询sql执行计划结果说明

关于explain的官方文档地址(5.7版本的):https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

可以看出执行explain查询的结果如下:

id

官方说明

select查询的序列号,这个序列号标识select执行的优先级,序号越大,优先级越高,序号相同,则优先级相同。当查询关联到union结果集时,id允许为null。

比如表连接查询的时候优先级是相同的:

 对于含有子查询的sql,子查询的优先级是高于外层查询的,因此子查询的id号大于外层查询的id号。如下:

当id为null时,表示这是一个union结果集,不需要用它来查询

 select_type

官方说明:

查询的类型,取值可以是SIMPLE、PRIMARY、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY、DERIVED、MATERIALIZED、UNCACHEABLE SUBQUERY、UNCACHEABLE UNION。

下面介绍几个经常会见到的:

SIMPLE:字面意义上理解是简单的查询,没有用到UNION 或子查询。如:

PRIMARY:复杂sql中最外层的查询,

SUBQUERY:子查询,如下:

UNION:UNION 中的第二个或以后的 SELECT 语句,下图中report_attr为union后的(即union中的第二个),select_type显示为UNION。

UNION RESULT:UNION的结果集,如下图中第三行为id为2和id为3的结果集UNION后的结果集

DERIVED:衍生表,即查询过程中生成的临时结果集。

 table

官方说明

 所引用的表名称,当为衍生表时,值为<derived+衍生表id>,如:<derived2>;当为联合结果集时值为<union+union第一个表id,union第二个表id>,如:<union2,3>

 partitions

这个字段是关于分区表的分区记录,很少用到,在此不再说明,感兴趣可以去官网了解。

 type

这个字段是比较重要的,主要取值如下:system, const, eq_ref, ref, range, index, ALL

性能从左到右越来越低system > const > eq_ref > ref > range > index > ALL

  • system

这是 const 连接类型的一个特例。当表数据只有一条时连接类型为system

  • const 

该表最多有一个匹配行,在查询开始时读取。 因为只有一行,所以这一行中列的值可以被优化器的其余部分视为常量。 const 表非常快,因为它们只被读取一次。

当您将 PRIMARY KEY 或 UNIQUE 索引的所有部分与常量值进行比较时,将使用 const。

也就是说当查询的结果集只有一行时会采用const连接,比如当用主键作为条件查询或者用不重复索引作为条件是将用const

  • eq_ref

 当表连接查询时,用到某个表的主键索引或其他唯一索引作为条件时,将会用ep_ref的连接方式,除了 system 和 const 类型之外,这是最好的连接类型。

 

 

  •  ref

 当使用的条件不是主键索引或者唯一索引,而是普通索引时,连接方式是ref,也就是说该条件可能会匹配多行而不是一行时用到ref

 

 

  •  range


当在索引字段上加范围条件是用到range连接。

当使用 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE 或 IN() 运算符中的任何一个将键列与常量进行比较时,可以使用范围

 

 

  •  index

索引连接类型与 ALL 相同,只是扫描索引树。 这有两种方式:

如果索引是查询的覆盖索引并且可以用于满足表中所需的所有数据,则仅扫描索引树。 在这种情况下,Extra 列显示使用索引。 仅索引扫描通常比 ALL 快,因为索引的大小通常小于表数据。

使用从索引中读取以按索引顺序查找数据行来执行全表扫描。 使用索引不会出现在 Extra 列中。

当查询仅使用属于单个索引的列时,MySQL 可以使用此连接类型。

也就是说当查询的结果在索引树中都存在的话不需要全表扫描,效率会比ALL快些,Extra列中显示Using index。

如果语句中有ALL,需要考虑优化。

 

 

  • ALL

全表扫描,效率最低,如果出现这个字段,需要考虑优化。

一般情况下,查询语句要控制type在range,如果效率低于这个,则要考虑优化。

 

标签:const,UNION,explain,查询,索引,详解,ref
From: https://www.cnblogs.com/yashuadiula/p/16626507.html

相关文章

  • 通信协议详解(一):IIC总线协议(传输时序+数据格式+设计实现) - 知乎
    一、IIC(Inter-IntegratedCircuit)介绍    IIC(Inter-IntegratedCircuit)即集成电路总线,它是一种具有两线传输的串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了......
  • 强大的可视化利器 Chrome Trace Viewer 使用详解
    Limboy强大的可视化利器ChromeTraceViewer使用详解2020-03-21最近研究了下Chrome自带的TraceViewer,发现功能还挺强大的,用来做PerformanceProfil......
  • List<Integer>详解
    一.关于Integer一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double等。然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类......
  • go语言接口详解
    go语言实现接口的条件如果一个任意类型T的方法集为一个接口类型的方法集的超集,则我们说类型T实现了此接口类型。T可以是一个非接口类型,也可以是一个接口类型。实现......
  • RocketMQ 的详解
    https://blog.csdn.net/qq_57558631/article/details/124239371https://www.cnblogs.com/happydreamzjl/articles/11951245.htmlhttps://cdn.modb.pro/db/72488https://......
  • 大数据技术Flume框架详解
    Flume的概述Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。高可用(HA)flume框架(故障转移机制)高......
  • 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
    服务器TIME_WAIT和CLOSE_WAIT详解和解决办法-悟寰轩-叶秋-博客园 https://www.cnblogs.com/sunxucool/p/3449068.html昨天解决了一个HttpClient调用错误导致的服务......
  • (转)SNMP学习笔记之SNMPWALK 安装与使用详解
    0x00 简介snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可......
  • 数位DP详解
    数位dp一般针对统计某个区间符合一个或多个条件的数的数量,因为算法名字叫数位dp,所以我们需要对数位进行枚举思路考虑,传统做法,例如统计[L,R]之间有多少个数,该数至少含......
  • 详解 OpenDAL |Data Infra 研究社第三期
    你是否对 OpenDAL的设计和使用还有不解,急需一个系统的解释去深入了解呢?对于 OpenDAL在Databend中的应用是否了解?本次直播我们会携手旋涡老师一起为大家答疑解惑,学习......