首页 > 数据库 >MySQL explain

MySQL explain

时间:2024-03-07 12:12:12浏览次数:34  
标签:表示 index explain 使用 查询 索引 MySQL Using

简介

mysql explain(或desc)用于分析SQL语句的执行计划,多用于测试查询性能。语法:explain sql...

注意

  1. explain执行DML语句,数据不发生变化。
  2. explain执行的结果可以有多条数据,一条数据对应一个表,如果涉及union,MySQL内部会产生一个临时表,就会导致结果多一行数据。
  3. union all不会创建临时表,所以就不会有多一行的数据。

id

这是select编号,不是返回结果的自增id。
值越大优先级越高。
如果涉及多表join,id就会重复,因为就一个select。
涉及子查询,MySQL Server 优化器 可能会把子查询转化为join,所以联调select id可能都是1
涉及union,临时表的那一列,id值为null。

select_type

操作类型,包括简单表查询、联合查询、子查询等。

  • SIMPLE: 简单表查询,不包含union或者子查询。
  • PRIMARY: 主查询,复杂查询中的最外层查询,或者union中左边的表。
  • SUBQUERY: 不相关子查询
  • DEPENDENT SUBQUERY: 依赖外部查询的子查询,或者称之为相关子查询。
  • DERIVED: 派生表,从查询结果派生的临时表,from后面的子查询。
  • UNION: UNION 查询中各个子查询的操作类型。
  • UNION RESULT: UNION 查询的结果集。
  • DEPENDENT UNION: 依赖外部查询的 UNION 查询,也就是子查询中有union
  • UNCACHEABLE SUBQUERY: 无法被缓存的子查询。
  • UNCACHEABLE UNION: 无法被缓存的 UNION 查询。

table

被操作的表,用于显示被操作的对象。
实际表名:表示查询语句中直接引用的表名。

  • <derivedN>:表示派生表,它是从查询结果中派生出来的临时表,派生表的编号可能是 1、2、3 等。
  • <unionM-N>:表示 UNION 查询中的结果集,其中 M 表示结果集的编号,N 表示 UNION 查询中的子查询编号。
  • <temporary>:表示临时表,这是在查询过程中创建的临时存储表。
  • <subqueryN>:表示子查询结果,其中 N 是子查询的编号。

partitions

分析 MySQL 查询语句如何利用分区表的工具,可以查看 MySQL 执行查询时会涉及到哪些分区,以及查询优化器如何选择分区来执行查询。

type

返回在执行查询时使用的访问方法,和索引相关, 已做排序。

  • system,当使用MyiSAM或Memory引擎的表只有一条记录的时候是system,不要奢望。
  • const:使用主键索引,或唯一索引等值匹配。
  • eq_ref:使用join时,被驱动表通过主键或者唯一索引列进行等值关联的方式,例如select * from a left join b on a.id = b.id;,b是eq_ref,a是all。
  • ref: 使用非唯一索引等值匹配。
  • range:对添加过任意索引的列,进行范围匹配,<、<=、>、>=、in、between。
  • index:MySQL 使用索引来扫描整个索引树,不需要回表,通常会发生在覆盖索引的情况。
  • ALL:全表扫描。

不常见类型:

  • fulltext:全文索引。
  • ref_or_null:对二级索引进行等值匹配,并添加or = null的条件。
  • index_merge:使用了多个单列索引来执行查询。当在查询条件中存在多个列,且每个列都有单独的索引时。
  • unique_subquery:不容易遇见,in 后面跟子查询,查询优化器将in转换为exists子查询,且这些自查徐你可以使用到主键进行等值匹配才可以。如explain select * from table1
    where field in (select id from table2 where talbe1.fieldn = 'string') or field2 = 'string'
  • index_subquery:使用子查询的结果作为索引来访问另一个表。

possible_keys

根据where/group by修饰的字段,可能使用的索引,并不保证实际执行时一定会使用这些索引,可以有多个。

key

表示实际选择的索引。

keylen

索引字段的最大长度,单位字节,值越大越好,主要对于联合索引有参考意义。
注意这里的越大越好,是跟当前字段的情况比较,如int类型占4个字节,显示4或者5(包含null)就很好。如果是varchar(100),则显示400,或403(utf8mb4+null+记录长度的字节 ==> 100 * 4 + 1 + 2,如果字段不为null,则省掉一个字节),比显示260更好。

ref

索引列做等值查询时,与索引列进行等值匹配的对象信息,对性能优化参考意义不大。
例如等值匹配到了,返回const。

rows

预估本次查询要扫描的行数,值越小越好,小了代表范围精准,进而实现快速查找。

filtered

该filtered列指示按表条件过滤的表行的估计百分比。越大越好。最大值为 100,这意味着没有发生行过滤。
从 100 开始递减的值表示过滤量的增加。。例如如果 rows为 1000, filtered为 50.00 (50%),则与下表连接的行数为 1000 × 50% = 500。

Extra

用于备注补充。

  • Using temporary:表示SQL使用union创建的临时表所在行。
  • Using index 表示查询使用了覆盖索引,即只使用了索引而没有访问实际的数据行,这通常发生在查询条件中包含了索引覆盖的所有列。
  • Using where 表示查询使用了 WHERE 子句过滤数据。
  • Using temporary 表示查询需要创建临时表来处理结果集,这可能发生在使用了临时表进行排序操作或者连接操作时。
  • Using filesort 表示查询需要对结果集进行文件排序操作,这通常发生在无法使用索引完成排序时。
  • Using join buffer 表示查询使用了连接缓冲区来处理连接操作。
  • Impossible WHERE 表示 WHERE 子句的条件总是为 false,因此查询将返回空结果集。
  • Select tables optimized away表示由于某些优化,查询将跳过不必要的表访问。
  • Full table scan 表示查询将对整个表进行全表扫描,没有使用任何索引。
  • Using index condition:表示使用了索引下推。
  • Using index for group-by:表示查询使用了索引进行分组操作。
  • Using index for order by:表示查询使用了索引进行排序操作。
  • Using index for distinct 表示查询使用了索引进行去重操作。
  • Using index for limit:表示查询使用了索引来执行 LIMIT 操作。
  • Using index for merge:表示查询使用了索引合并进行连接操作。
  • Using where with pushed condition:表示查询的 WHERE 条件中的部分条件被推迟执行。
  • Loose index scan: 表示在一些情况下,MySQL 可能对索引的列进行宽松扫描,而不是精确匹配。
  • Range checked for each record: 表示对于每个匹配的记录,都需要进一步检查范围条件。
  • Using index for LIKE: 表示使用索引执行了 LIKE 查询。
  • Distinct: 表示在处理查询数据时会进行去重操作。
  • Order by: 表示查询需要进行排序操作。
  • Table is marked as crashed and should be repaired: 表示表已标记为损坏,需要修复。
  • No tables used: 表示查询使用了某种优化方式,无需访问任何表。
  • Range checked for each record (index map: N): 和 Range checked for each record 类似,但额外说明了哪个表进行了进一步的范围检查。

扩展

explain 支持使用原生SQL进行json格式输出,用法explain format=json sql...。

标签:表示,index,explain,使用,查询,索引,MySQL,Using
From: https://www.cnblogs.com/phpphp/p/18058593

相关文章

  • 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
    1、前言为什么说是伪微服务框架,常见微服务框架可能还包括服务容错、服务间的通信、服务追踪和监控、服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了。年前到现在在开发一个新的小项目,刚好项目最初的很多功能是比较通用的,所以就想着将这些功能抽......
  • Mysql自定义函数报错合集
    参考:Mysql自定义函数报错解决方法1.在MySql中创建自定义函数报错信息如下:1.1错误显示ERROR1418(HY000):ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATAinitsdeclarationandbinaryloggingisenabled(youmightwanttousethelesssafel......
  • 【已解决】[图文步骤] message from server: “Host ‘172.17.0.1‘ is not allowed t
    写于2024.03.07北京.朝阳@目录报错信息环境现场解决方案步骤:成功最后报错信息先看看和你的报错一样不一样null,messagefromserver:"Host'172.17.0.1'isnotallowedtoconnecttothisMySQLserver"环境现场mac电脑使用docker部署了一个mysql。docker......
  • Mysql 基础
    创建数据库CREATEDATABASENAME;创建表#中括号[]是可选的意思,命令中不带中括号CREATETABLEtable_name(column1datatype[NULLorNOTNULL][DEFAULT默认值][AUTO_INCREMENTPRIMARYKEY],column2datatype,...//上边没有PRIMARYKEY可以在最下......
  • java mysql事物特性记录,在同一事物中更新执行后,立即查询得到的是新数据还是旧数据?
    在Java中,如果你使用MySQL,并且你在一个事务方法中执行了更新操作,那么在这个事务结束并提交之前,其他事务或查询(非同一事务内的)是看不到你的更新结果的。这是数据库事务的隔离性所保证的。 但是,如果你在同一事务中立即执行查询,你将看到更新后的数据。因为查询和更新都在同一个事务......
  • 用几张图实战讲解MySQL主从复制
    本文分享自华为云社区《结合实战,我为MySQL主从复制总结了几张图!》,作者:冰河。MySQL官方文档MySQL主从复制官方文档链接地址如下所示:http://dev.mysql.com/doc/refman/8.0/en/replication.htmlMySQL主从复制方式MySQL5.6开始主从复制有两种方式:基于日志(binlog)、基于GTID(......
  • MySQL binlog/redolog/undolog 的区别?
    想和大家聊聊InnoDB中的锁机制,那么不可避免的要涉及到MySQL的日志系统,binlog、redolog、undolog等,看到有小伙伴总结的这三个日志还不错,赶紧拿来和各位小伙伴分享。日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、......
  • 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位
    说明所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面。究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸,自己当年也是这么过来的。今天我就毕其功于一役,解放大家的时间,让凡人的环境配置见鬼去吧......
  • Mysql和Oracle在group by中的一些差异
    1.是否select字段需要全部出现?Oracle中出现在select列表中的字段或者出现在orderby后面的字段,如果不是包含在分组函数中,那么该字段必须同时在groupby子句中出现。Mysql没有此限制例:Mysql中,以下SQL语句是成立的,可见这里的GroupbySELECTp.PDTNO,p.PDTNAME,sum(a.QUAN......
  • Mysql和Oracle在order by上关于聚合函数一些不同的差异
    1.问题SELECTp.PDTNO,p.PDTNAME,sum(a.QUANTITY)ASapplySumCountFROMPRODUCTpJOINAPPLYaONp.PDTNO=a.PDTNOGROUPBYPDTNOORDERBYapplySumCountDESC;在Mysql中我们经常将select中聚合函数得到的结果起别名用于orderby但是同样的方式在Oracle中就不行,......