mysql - explain执行计划

explain执行计划

explain是mysql中一关键字,用于查看执行计划, 模拟执行器执行sql查询语句, 从而分析sql语句或表结构的性能瓶颈或优化方向。

explain用途

可分析得到以下信息:

  1. 表读取顺序
  2. 数据读取操作的操作类型
  3. 可使用的索引
  4. 实际使用的索引
  5. 表间引用
  6. 遍历数据行数

explain字段

explain结果返回以下字段

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra

实例

下列说明中的查询,以该表结构为例

CREATE TABLE `user` (`id` int NOT NULL COMMENT 'id',`name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '姓名',`age` int NOT NULL COMMENT '年龄',`sex` tinyint(1) NOT NULL COMMENT '性别',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '电话',PRIMARY KEY (`id`),UNIQUE KEY `idx_phone` (`phone`),KEY `idx_name` (`name`),KEY `idx_name_age_sex` (`name`,`age`,`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

id

id为select的序列号,有几个select,就有几个id

  • id值不同:如果是只查询,id的序号会递增,id值越大优先级越高,越先被执行
  • id值相同:从上往下依次执行;
  • id列为null:表示这是一个结果集,不需要使用它来进行查询。

select_type 查询类型

  1. simple

    表示查询中不包含union操作或子查询

    explain select * from user where id = 1
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1 S I M P L E \color{#f56c6c}{SIMPLE} SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
  2. primary

    需要union或者含子查询的select,位于最外层查询的select_type即为primary, 有且只有一个

    explain select * from user where id = 1 union select * from user where id = 2
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1 P R I M A R Y \color{#f56c6c}{PRIMARY} PRIMARYuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    2UNIONuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    ( N u l l ) \color{#909399}{(Null)} (Null)UNION RESULT<union1,2> ( N u l l ) \color{#909399}{(Null)} (Null)ALL ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null)Using temporary
  3. subquery

    子查询

    explain select * from user where id = (select id from user where id = 1)
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1PRIMARYuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    2 S U B Q U E R Y \color{#f56c6c}{SUBQUERY} SUBQUERYuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00using index
  4. union

    需要union的select

    explain select * from user where id = 1 union select * from user where id = 2
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1PRIMARYuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    2 U N I O N \color{#f56c6c}{UNION} UNIONuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    ( N u l l ) \color{#909399}{(Null)} (Null)UNION RESULT<union1,2> ( N u l l ) \color{#909399}{(Null)} (Null)ALL ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null)Using temporary
  5. union result

    从union表获取结果的select, 由于不参与查询, 故id为null

    explain select * from user where id = 1 union select * from user where id = 2
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1PRIMARYuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    2UNIONuser ( N u l l ) \color{#909399}{(Null)} (Null)constPRIMARYPRIMARY4const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    ( N u l l ) \color{#909399}{(Null)} (Null) U N I O N \color{#f56c6c}{UNION} UNION R E S U L T \color{#f56c6c}{RESULT} RESULT<union1,2> ( N u l l ) \color{#909399}{(Null)} (Null)ALL ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null)Using temporary

table 当前查询正在访问的数据表

  • 如果查询使用了别名,则table显示的是别名
  • 如果不涉及对数据表的操作,则table为null
  • 如果结果为<X,Y>,XY为执行计划的id, 表示结果来自该查询

type 查询范围

从好到坏以此为:

system > const > eq_ref >ref > range > index > ALL
  1. system

    表中只有一行数据(等于系统表),这是const 类型的特例,平时不会出现,可以忽略不计。

  2. const

    使用唯一索引或者主键,表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const。

  3. eq_ref

    唯一性索引扫描,对于每个索引键,表中只有一行数据与之匹配。常见于主键或唯一索引扫描。

    explain select * from user a1,user a2  where a1.id = a2.id
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEa1 ( N u l l ) \color{#909399}{(Null)} (Null)ALLPRIMARY ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null)99100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
    2SIMPLEa2 ( N u l l ) \color{#909399}{(Null)} (Null) e q _ r e f \color{#f56c6c}{eq\_ref} eq_refPRIMARYPRIMARY4 t e s t . a 1. i d \color{#f56c6c}{test.a1.id} test.a1.id1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
  4. ref

    非唯一性索引扫描,返回匹配某个单独值的所有行。本质也是一种索引。

    explain select * from user where name = 'user1'
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null) r e f \color{#f56c6c}{ref} refidx_name,idx_name_age_sexidx_name1022const1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
  5. range

    索引范围扫描,常见于使用>,<,between ,in ,like等运算符的查询中。

    explain select * from user where id in (1,2)
    
    idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
    1SIMPLEuser ( N u l l ) \color{#909399}{(Null)} (Null) r a n g e \color{#f56c6c}{range} rangePRIMARYPRIMARY4 ( N u l l ) \color{#909399}{(Null)} (Null)2100.00Using where
  6. index

    索引全表扫描,把索引树从头到尾扫一遍。index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Indx都是读全表,但index是从索引中读取的,而all是从硬盘中读的)

  7. all

    全表扫描(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)

  8. NULL

    MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。

possible_keys 查询可能使用到的索引

key 查询实际使用的索引

select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。

key_len 用于处理查询的索引长度

用于处理查询的索引长度,表示索引中使用的字节数。通过这个值,可以得出一个多列索引里实际使用了哪一部分。

key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

ref

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

explain select * from user a1,user a2  where a1.id = a2.id
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEa1 ( N u l l ) \color{#909399}{(Null)} (Null)ALLPRIMARY ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null)99100.00 ( N u l l ) \color{#909399}{(Null)} (Null)
2SIMPLEa2 ( N u l l ) \color{#909399}{(Null)} (Null)eq_refPRIMARYPRIMARY4 t e s t . a 1. i d \color{#f56c6c}{test.a1.id} test.a1.id1100.00 ( N u l l ) \color{#909399}{(Null)} (Null)

rows

表示MySQL根据表统计信息及索引选用情况,大致估算的找到所需的目标记录所需要读取的行数,不是精确值。

filtered

filtered列返回的是根据条件筛选的百分比值,最大值为100,意味着没有对其进行筛选。数值越小,说明筛选量越大。rows表示大致遍历的数量,rows x filtered 表示表连接的行数。例如,当rows为100,filtered为50时,与表连接的行数为100 * 50% = 500

The filtered column indicates an estimated percentage of table rows filtered by the table condition. The maximum value is 100, which means no filtering of rows occurred. Values decreasing from 100 indicate increasing amounts of filtering. rows shows the estimated number of rows examined and rows × filtered shows the number of rows joined with the following table. For example, if rows is 1000 and filtered is 50.00 (50%), the number of rows to be joined with the following table is 1000 × 50% = 500.

extra

额外信息。

参数说明
Using index查询覆盖了索引,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。
Using index condition查询的列未被索引覆盖,where筛选条件是索引的前导列。这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。
Using filesortMySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。
Using temporary用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
Not existsMYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。
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操作,在找到第一匹配的元组后即停止找同样值的动作

exlpain的局限性:

  • EXPLAIN不会告诉关于触发器、存储过程的信息或用户自定义函数对查询的影响情况;
  • EXPLAIN不考虑各种Cache;
  • EXPLAIN不能显示MySQL在执行查询时所作的优化工作;
  • 部分统计信息是估算的,并非精确值;
  • EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看。

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

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

相关文章

微软开源多模态大模型Phi-3-vision,微调实战来了

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM&#xff0b;vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

stream( ).collect ( Collectors.groupingBy ( ) ) 的用法

文章目录 第一种解释1、基本用法2、指定值收集器3、多级分组4、常见应用场景和用处 第二种解释1、基本语法2、示例3、更复杂的用法 第一种解释 Collectors.groupingBy 是 Java 8 引入的 Stream API 中的一个收集器&#xff08;Collector&#xff09;&#xff0c;它用于将流&am…

Golang:flosch/pongo2是一个类似Django模板语法的模板引擎

模板引擎可以用来做一些字符串渲染拼接工作&#xff0c;避免在代码中出现大量的字符串拼接 文档 https://www.schlachter.tech/solutions/pongo2-template-engine/https://github.com/flosch/pongo2 安装 go get -u github.com/flosch/pongo2/v6使用示例 1、字符串模板 p…

【笔记】Qt 按钮控件介绍(QPushButton,QCheckBox,QToolButton)

文章目录 QAbstractButton 抽象类(父类)QAbstractButton 类中的属性QAbstractButton 类中的函数QAbstractButton 类中的信号QAbstractButton 类中的槽 QPushButton 类(标准按钮)QPushButton 类中的属性QPushButton 类中的函数、槽 QCheckBox 类(复选按钮)QCheckBox 类的属性QCh…

Html中,想利用JS引入Jquery文件;$.getScript()无效

在使用$.getScript()时&#xff0c;会爆出错误&#xff1a;ReferenceError: $ is not defined &#xff0c;这是因为没有在JS文件前引入Jquery。 那么可以这样使用&#xff1a;(这个方式只适合放在页面代码最后面使用) (function () {var script window.document.createEleme…

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

PHP反射API与接口的动态分析

PHP的反射&#xff08;Reflection&#xff09;API 提供了一种在运行时获取类和对象信息的能力&#xff0c;包括类的方法、属性、接口等。这对于动态分析、构建IDE的自动完成功能、或者进行复杂的元编程非常有用。以下是如何使用PHP反射API进行动态分析的示例代码。 1. 反射类&…

MySQL触发器怎么使用?

触发器&#xff08;Trigger&#xff09;是数据库中的一种重要机制&#xff0c;用于在特定的数据库事件&#xff08;如插入、更新或删除&#xff09;发生时&#xff0c;自动执行预定义的SQL语句。在MySQL中&#xff0c;触发器能够帮助我们实现复杂的业务逻辑、数据验证和自动化任…

ComfyUI 本地部署指南:概念、部署过程、生成图片、共享 WebUI 模型

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要讲解 ComfyUI 的本地部署指南&#xff0c;内容主要包括&#xff1a;ComfyUI 的概念、ComfyUI 本地部署过程、使…

MySQL---增删改查

MySQL是一个流行的关系型数据库管理系统,它使用结构化查询语言(SQL)来管理数据库中的数据。以下是MySQL中增删改查(CRUD)操作的基本命令: 创建(Create): 创建新表:CREATE TABLE table_name (column1 datatype,column2 datatype,...PRIMARY KEY (column) );插入数据:…

inventor 2021 Inventor 无法访问您的许可。网络许可不可用 也会出现在其他软件上

错误提示一般如下图 Inventor 无法访问您的许可。 无法访问您的许可 最常见的原因有: 未连接到 Internet许可服务器不工作许可服务器找不到有效许可 您可以执行以下操作: 检查是否连接到 Intemnet停止/重新启动许可服务器 如需进一步帮助&#xff0c;您可以: -与 CAD或IT管理…

C++11function包装器的使用

类模板std::function是一种通用、多态的函数包装。std::function的实例可以对任何可以调用的目标实体进行存储、 复制和调用操作。这些目标实体包括普通函数、Lambda表达式、函数指针、以及其他函数对象等。std::function对象是对 C中现有的可调用实体的一种类型安全的包裹&…

【全开源】班级管家微信小程序(FastAdmin+ThinkPHP)

班级管家微信小程序 班级管家微信小程序&#xff0c;作为一款专注于家校沟通、作业管理、成绩发布等方面的工具&#xff0c;凭借其丰富的特色功能和显著的优势&#xff0c;已经成为广大教师、家长和学生日常学习生活中不可或缺的一部分。 一、特色功能 家校沟通便捷&#xff…

42-1 应急响应之账户排查

一、用户信息排查 在服务器被入侵后,攻击者可能会建立相关账户(有时是隐藏或克隆账户),方便进行远程控制。攻击者会采用的方法主要有如下几种: 直接建立一个新的账户:攻击者直接创建一个新的账户,有时为了混淆视听,账户名称与系统常用名称相似。 激活一个系统中的默认…

Vue3实现简单的瀑布流效果,可抽离成组件直接使用

先来看下效果图&#xff1a; 瀑布流中的内容可进行自定义&#xff0c;这里的示例图是通过不同背景颜色的展示进行区分&#xff0c;每个瀑布流中添加了自定义图片和文字描述。 实现方式&#xff1a; 1.建立子组件&#xff08;可单独抽离&#xff09;写出瀑布流的样式 文件名为…

数据结构之时间复杂度和空间复杂度的相关计算

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 时间复杂度 概念 大O的渐进表示法 相关练习 例1&#xff1a; 例2&#xff1a; 例3&am…

C++时间操作

C时间操作 文章目录 C时间操作sleep系列sleepnanosleepstd::this_thread::sleep_for sleep系列 sleep sleep 是在计算机编程中用于暂停当前进程或线程一段时间的函数。让程序暂停执行指定的秒数。 sleep 函数在 <unistd.h> 头文件中定义&#xff0c;其原型如下&#x…

重磅推荐!四信AI智能一体屏系列全网上线

近年来&#xff0c;随着物联网、云计算、人工智能等新兴技术快速发展&#xff0c;制造、能源、交通、零售、医疗等行业设备需要更高程度的自动化控制。 传统的计算机和控制设备早已无法满足如今高性能复杂任务的要求&#xff0c;越来越多主流行业的项目落地依靠工控机&#xff…

基于springboot的大创管理系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足&#xff0c;创建了一个计算机管理大创管理系统的方案。文章介绍了大创管理系统的系统分析部分&…