MySQL中的Explain用法

article/2025/9/29 14:46:42

一、Explain介绍
  使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而就可以知道MySQL是如何处理你的SQL语句的,可以用来分析你的查询语句或者是表结构的性能瓶颈。
  通过EXPLAIN我们可以分析出以下结果:
    ●表的读取顺序
    ●数据读取操作的操作类型
    ●哪些索引可以使用
    ●哪些索引被实际使用
    ●表之间的引用
    ●每张表有多少行被优化器查询

  使用方式如下:

EXPALIN + SQL语句

执行计划所包含的信息:
 在这里插入图片描述

二、Explain各列信息含义

列名说明
id执行的编号,标识select所属的行。如果在语句中没有子查询或者关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置
select_type显示本行是简单查询或者是复杂查询,如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUIT)
table数据的查询访问引用了哪个表
type数据访问/读取的操作类型(ALL、index、range、ref、eq_ref、const、system、NULL)
possible_keys显示哪些索引可能有利于高效的数据查询
key显示优化器最终决定采用的索引
key_len显示使用索引中所使用的字节数
ref显示了之前的表在key列记录的索引中查找值所用的列或者常量
rows为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值想乘,可粗略估算整个查询会检查的行数
Extra额外信息,如using index、filesort等

1)id
  id是用来顺序标识整个查询中SELECT语句的编号,在嵌套查询中id越大的语句越先执行。该值可能为NULL,那么这一行用来说明的是其他行的联合结果。
  
2)select_type
  表示查询的类型

类型说明
simple简单子查询,查询中不包含子查询和union
primary包含union或者子查询,最外层的部分标记为primary
subquery在select或者where列表中包含了子查询
derived派生表,该临时表是从子查询中派生出来的,位于form中的子查询
union位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary,如果是union位于from中则标记为derived
union result用来从匿名临时表里检索结果的select被标记为union result
dependent union顾名思义,首先需要满足union的条件,及union中第二个以及后面的select语句,同时该语句依赖外部的查询
dependent subquery和dependent union相对union一样

3)table
  对应行正在访问哪一个表,表名或者别名。
  ●关联优化器会为查询选择关联顺序,左侧深度优先
  ●当form中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
  ●当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id
  注意:MySQL对待这些表和普通表一样,但是这些"临时表"是没有任何索引的。

4)type
  type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
  system > const > eq_ref > ref > fulltext > req_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,一般来说,得保证查询至少达到range级别,最好能够达到ref。

类型说明
system表只有一行记录(等于系统表),这是const类型的特例
const当确定查询最多只会有一行匹配的时候,MySQL优化器会在查询前读取它并且只读取一次,即通过索引一次就找到了数据,因此非常快。当主键放入where子句时,mysql会把这个查询转换为一个常量(高效)
eq_ref唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它返回所有匹配某个单独值得行,然而,它可能会找到多个符合条件的行,所以它属于查找和扫描的混合体
range只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般是在where语句中出现between、<、>、in等的查询中,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点不用做扫描全部索引
indexindex和all的区别为index类型只遍历索引树,这通常比all要快,因为索引文件通常比数据文件小,也就是说all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读取的
all最坏的情况,将遍历全表以找到匹配的行

5)possible_keys
  显示查询使用了哪些索引,表示该索引可以进行高效的查找,但是列出来的索引对于后续优化过程可能是没有用的。

6)key
  key列显示了MySQL优化器实际上所决定使用的键(索引),如果没有选择索引,键是NULL。要想MySQL使用或者忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

7)key_len
  表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。key_len显示地值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

8)ref
  显示索引的那一列被使用了,如果可能的话,最好是一个常数。哪些列或者常量被用于查找索引列上的值。

9)rows
  rows列显示MySQL认为它执行查询时必须检查的行数,注意这是一个预估值。

10)Extra
  Extra是Explain输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

类型说明
Using filesoftMySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesoft说明MySQL使用了后者,但注意虽然叫filesoft但并不是说明就是用了文件来进行排序,只要可能排序 都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是order by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。
Using temporary用临时表保存中间结果,常用于group by和order by操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
Not existsMySQL优化了left join,一旦它找到了匹配left join标准的行,就不再搜索了
Using index说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息,如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录
Using index condition这是MySQL 5.6出来的新特性,叫做"索引条件推送"。简单说就是MySQL原来在索引上是不能执行如like这样的模糊匹配操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。
Using where使用了where从句来限制哪些行将于下一张表匹配或者返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用where条件过滤
Using join buffer使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接
impossible wherewhere子句的值总是false,不能用来获取任何元组
select tables optimized away在每有group by子句的情况下,基于索引优化min/max操作,或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct优化distinct操作,在找到第一个匹配的元组后即停止找同样值得动作


http://chatgpt.dhexx.cn/article/55GxcIkf.shtml

相关文章

mysql中explain用法和结果的含义

explain select * from user explain extended select * from user id SELECT识别符。这是SELECT的查询序列号 select_type SELECT类型,可以为以下任何一种: SIMPLE:简单SELECT(不使用UNION或子查询) PRIMARY:最外面的SELECT UNION:UNION中的第二个或后面的SELECT语句 DEPEND…

EXPLAIN用法解析

1. EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 ➤ 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引…

MySQL中Explain用法详解

Explain简介 我们在写后端程序的时候&#xff0c;通常会写sql来查询数据&#xff0c;如果是单表查询的时候&#xff0c;那直接select就完事了&#xff0c;但是如果是连表查询数据量也不小的话&#xff0c;就造成了查询速度会比较慢&#xff0c;那么我们该怎么知道我的sql的实际…

【MySQL】explain 用法详解

【MySQL】explain 用法详解 explain命令主要来查看SQL语句的执行计划&#xff0c;查看该SQL语句有没有使用索引&#xff0c;有没有做全表扫描等。它可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理用户的SQL语句。 文章目录 【MySQL】explain 用法详解一、e…

Explain详解

目录 一、表信息 二、explain 的两种使用方式 三、explain中的列 1. id列 2. select_type列 3. table列 4. type列 5. possible_keys列 6. key列 7. key_len列 8. ref列 9. rows列 10. Extra列 四、索引最佳实践 使用EXPLAIN关键字可以模拟优化器执行SQL语句&…

mysql 用法 Explain

前言&#xff1a;explain&#xff08;执行计划&#xff09;&#xff0c;使用explain关键字可以模拟优化器执行sql查询语句&#xff0c;从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。 注&#xff1a;本系列随笔如无特殊说明都MySQL版本都为…

Mysql中explain的用法详解

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

explain用法和结果分析

1. EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实…

Explain使用详解

在日常开发工作中&#xff0c;对于SQL的书写&#xff0c;通常都会尽量让SQL能够使用到表中创建的索引&#xff0c;以此来提高SQL语句的性能。想要参看一个SQL是否会使用索引&#xff0c;可以使用MySQL字段的分析工具Explain&#xff0c;这篇文章重要介绍该工具的使用。 一、 简…

EXPLAIN 的用法

用法简介 EXPLAIN 的用法很简单&#xff0c;只需要在你的 SQL 前面加上 EXPLAIN 即可。例如&#xff1a; explain select * from t; PS&#xff1a;insert、update、delete 同样可以通过 explain 查看执行计划&#xff0c;不过通常我们更关心 select 的执行情况 你会看到如下…

[MySQL高级](一) EXPLAIN用法和结果分析

1. EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 ➤ 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序数据读取操作的操作类型哪些索引可…

.NET6.0的日志组件Log4net

前言&#xff1a;不允许让没有任何日志监控的项目上线&#xff0c;所以说真正开发起来必须要有监控&#xff0c;相当于多一双眼睛帮着我们看项目在运行时会不会有什么问题&#xff0c;我们要不断的在每个环节写日志&#xff0c;这样发生异常我们可以快速知道哪里有问题了&#…

Unity接入日志插件Log4Net

前言 log4net是一个日志插件&#xff0c;可以帮助我们把控制台输出的日志写入到本地。这个功能说简单就简单&#xff0c;说复杂其实还挺复杂。 为什么这么说呢&#xff0c;首先文件写入本地确实简单&#xff0c;但是如果你要实现一下功能就没那么简单了。 1.把每行日志按照指…

log4net多进程丢失日志的解决方法

首先为什么会有多进程同时记录日志到同一个文件夹同一个文件里呢&#xff0c;每个项目肯定有每个项目的特殊性&#xff0c;我这里.net的BS项目&#xff0c;主要是因为在IIS里&#xff0c;应用程序池&#xff0c;最大工作进程设置成2&#xff0c;就会出现2个w3p什么的进程同时运…

C# log4net 日志输出超详细

思路&#xff1a; 1.安装插件&#xff1a;安装log4net 2.使用配置&#xff1a;添加log4net配置信息 3.输出日志文件格式&#xff1a;添加日志配置 4.AssemblyInfo.cs中配置 第一步&#xff1a;安装log4net 第二步&#xff1a;在app.config添加log4net配置 新增log4net.config…

.Net Core3.1 集成Log4net

准备 第一步&#xff1a;nuget 引用 Microsoft.Extensions.Logging.Log4Net.AspNetCore 第二步&#xff1a;在项目中添加log4net.config的配置文件(配置文件在文末) 第三步&#xff1a;在项目中注册使用log4net 方法一&#xff1a;在Program.cs中注册&#xff0c;找到 Prog…

C#上位机开发(十三)—— 使用Log4net添加日志记录功能

一、Log4net 官方网站:https://logging.apache.org/log4net/。 下载二进制dll库: 包中提供了针对各个版本的dll库: 二、使用日志库 1. 添加库 复制对应的库文件到项目中: 2. 配置log4net 2.1. 创建配置文件 添加后修改该文件设置:

unity log4net

log4.et.confog.xml <?xml version"1.0" encoding"utf-8" ?><log4net> <appender name"Error" type"log4net.Appender.RollingFileAppender"> <lockingModel type"log4net.Appender.FileAppenderMinimal…

C#-Winform之log4net使用详细记录

一、作用 提供一个记录日志的框架&#xff0c;可以将日志信息记录到文件、控制台、Windows事件日志和数据库&#xff08;MSSQL、Acess、Oracle、DB2和SQLite等&#xff09;。 二、操作步骤 1.在项目中添加对log4net.dll的引用&#xff08;通过NuGet可以直接安装&#xff09; …

log4net在linux中不生成日志,log4net使用记录

1、在程序中引用log4net.dll 2、添加-新建配置文件Log4Net.config&#xff0c;并在文件属性中“复制到输出目录”选中“始终复制”&#xff0c;文件内容如下&#xff1a; 3、在AssemblyInfo.cs中添加代码&#xff0c;用于调用Log4Net.config&#xff1a; [assembly: log4net.Co…