Mysql 学习(十 二)查询优化 Explain

news2025/1/8 5:04:59

什么是Explain?

  • 一条查询语句经过Mysql查询优化器的各种基于成本和规则的优化后生成一个所谓的执行计划,而Explain 语句可以让我们知道执行计划的语法,从而我们有针对性的提升性能
  • 举例子:EXPLAIN SELECT 1
    在这里插入图片描述
  • 由此我们得到了一些参数,而这些参数我们可以知道我们这个执行计划做了那些优化,由此我们也可以依据这个去优化我们的sql
  • 对应参数如下:
    • table:
    • id:
    • select_type:
    • partitions:
    • type:
    • possible_keys:
    • key:
    • key_len:
    • ref:
    • rows:
    • filtered:
    • Extra:
  • 接下来我们就来讲解对应参数的含义

table

  • 由前几节我们知道,无论查询怎么复杂,我们查询实际上算是对每个表进行单表查询,所以在执行explain 语法,table列上会存放这次查询的表名
  • 举个例子:EXPLAIN SELECT * FROM city
    在这里插入图片描述
  • 上面是单表查询的,如果是连接查询,会怎么展示呢?
  • 举个例子:EXPLAIN SELECT * FROM city LEFT JOIN country on city.country_id = country.id
    在这里插入图片描述
  • 从这里可以看到有两条记录,分别对应city表和country表,通过其他参数我们可以知道,我们访问这两个表分别使用了什么查询方式

id

  • 任何查询都会有select ,普通的查询里面可能只有一个select,但是又子查询这种复杂查询就可能会有多个select,但我们知道本质上我们还是把一个拥有多个select语句拆分成多个select语句,所以我们进行优化的时候,需要给每个select定义一个id,这样才好分析
  • 情况一:只有一个select ,举个例子:EXPLAIN SELECT * FROM city LEFT JOIN country on city.country_id = country.id
    在这里插入图片描述
  • 情况二:有多个select,举个例子:EXPLAIN SELECT * FROM city WHERE country_id = (SELECT id FROM country where country = 'Austria')
    在这里插入图片描述
  • 情况三:查询优化器可能对涉及子查询的查询语句进行重写,从而转换为连接查询。所以如果我们想知道查询优化器对某个包含子查询的语句是否进行了重写,直接查看执行计划就好了,比如:EXPLAIN SELECT * FROM city WHERE country_id in (SELECT id FROM country )
    在这里插入图片描述
  • 情况四:union 子句,它会将多个查询的结果集合并起来并对结果集中的记录进行去重,会创建一个临时表,所以会产生一个id为null的记录,举个例子:EXPLAIN SELECT * FROM city UNION SELECT * FROM city
    在这里插入图片描述

select_type

  • 每个select的查询都会有不同的属性,我们之前之所以定义id 主要是为了更好的优化select语句,让我们知道每个select执行了那些操作,而select_type属性就是为了更好研究
  • select_type 取值:
    • SIMPLE:查询中不包含UNION或者子查询的查询方案

    • PRIMARY:查询中包含UNION,UNION ALL或者子查询的大查询中,由几个小查询组成,其中最左边的查询就是PRIMARY

      • 举个例子:EXPLAIN SELECT * FROM city UNION SELECT * FROM city
        在这里插入图片描述
    • UNION:对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION

      • 举个例子:EXPLAIN SELECT * FROM city UNION SELECT * FROM city
        在这里插入图片描述
    • UNION RESULT:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT

      • 举个例子:EXPLAIN SELECT * FROM city UNION SELECT * FROM city
        在这里插入图片描述
    • SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询时,该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY

      • 举个例子:EXPLAIN SELECT * FROM city WHERE country_id IN (SELECT id FROM country ) OR postal_code = 1010
        在这里插入图片描述
    • DEPENDENT SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY

    • DEPENDENT UNION:在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION

    • DERIVED:对于采用物化的方式执行的包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED

    • MATERIALIZED:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的select_type属性就是MATERIALIZED

    • UNCACHEABLE SUBQUERY

    • UNCACHEABLE UNION

partitions

  • 一般情况下我们的查询语句的执行计划的partitions列的值都是NULL。

type

  • 前几节我们知道查询是有访问方式,而在这里type字段就可以展示这个select语句是使用那种访问方式查询数据的
  • 类别:
    • system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system

    • const:当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const
      在这里插入图片描述

    • eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref
      在这里插入图片描述

    • ref: 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref

    • fulltext:全文索引

    • ref_or_null:当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null

    • index_merge:一般情况下对于某个表的查询只能使用到一个索引,但我们介绍单表访问方法时特意强调了在某些场景下可以使用Intersection、Union、Sort-Union这三种索引合并的方式来执行查询

    • unique_subquery:类似于两表连接中被驱动表的eq_ref访问方法,unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery

    • index_subquery:index_subquery与unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引

    • range:如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法
      在这里插入图片描述

    • index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index

    • ALL:全表扫描

possible_keys

  • 在EXPLAIN语句输出的执行计划中,possible_keys列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些
  • 比如下面这个例子,可能使用到的索引是idx_key1和idx_key3在这里插入图片描述

key

  • 在EXPLAIN语句输出的执行计划中,possible_keys列表示在某个查询语句中,对某个表执行单表查询时实际用到的索引有哪些
  • 比如下面这个例子,使用到的索引是idx_key3在这里插入图片描述

key_len

  • key_len列表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度,它是由这三个部分构成的:
    • 对于使用固定长度类型的索引列来说,它实际占用的存储空间的最大长度就是该固定值,对于指定字符集的变长类型的索引列来说,比如某个索引列的类型是VARCHAR(100),使用的字符集是utf8,那么该列实际占用的最大存储空间就是100 × 3 = 300个字节。
    • 如果该索引列可以存储NULL值,则key_len比不可以存储NULL值时多1个字节
    • 对于变长字段来说,都会有2个字节的空间来存储该变长列的实际长度。

ref

  • 当使用索引列等值匹配的条件去执行查询时,也就是在访问方法是const、eq_ref、ref、ref_or_null、unique_subquery、index_subquery其中之一时,ref列展示的就是与索引列作等值匹配的东东是什么,比如只是一个常数或者是某个列

rows

  • 如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数。

filtered

  • 之前说连接查询的时候计算成本有扇出这个概念,而执行计划的filtered列就代表查询优化器预测rows列中的记录有多少条满足其余搜索条件,这里存的是百分比,比如下面:
    在这里插入图片描述
  • 从执行计划中可以看出来,查询优化器打算把s1当作驱动表,s2当作被驱动表。我们可以看到驱动表s1表的执行计划的rows列为9688, filtered列为10.00,这意味着驱动表s1的扇出值就是9688 × 10.00% = 968.8,这说明还要对被驱动表执行大约968次查询。

Extra(待更新)

FORMAT=JSON 更加详细的执行计划(待更新)

optimizer trace(待更新)

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

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

相关文章

Prompt 指南

https://github.com/OleNet/YouPromptMe/tree/gh-pages/you-prompt-me 这是一份如何调整 Prompt 得到更漂亮的图片的经验性文档。结果和经验都来源于文心 ERNIE-ViLG Demo 和社区的资料。 极乐迪斯科里的猫,故障艺术 呼吁与准则 机器生成图片的最终目的还是便捷地为人类创造…

Cyanine7-Hylauronic菁染料CY7标记透明质酸Cy7-Hylauronic

荧光CY7是一种近红外荧光染料,具有高吸收和高荧光发射强度,适用于生物医学研究中的细胞成像和药物传递等领域。而荧光Cy7-Hylauronic透明质酸则是将荧光CY7与透明质酸结合而成的复合物,可以在细胞内或体内被稳定地释放,具有良好的…

【Python入门】Python循环语句(while循环的嵌套应用)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

centos7.5离线安装部署TiDB-6.5.0分布式系统

centos7.5离线安装部署TiDB-6.5.0分布式系统 一、需求,为什么要部署TiDB-6.5.0分布式系统 当前绝大部分企业的业务数据都分散在不同的系统中,没有一个统一的汇总,随着业务的发展,企业的决策层需要了解整个公司的业务状况以便及时…

抖音seo源码保姆式服务搭建|定制产品开发分享

抖音seo霸屏,是一种专为抖音视频创作者和传播者打造的视频批量剪辑,批量分发产品。使用抖音seo霸屏软件,可以帮助用户快速高效的制作出高质量的优质视频。 使用方法:1. 了解用户的行为习惯 2. 充分利用自身资源进行开发 3. 不…

蓝桥杯第十四届青少年Python组省赛试题--第4题

提示信息: 杨辉三角就是一个用数排列起来的三角形(如下图),杨辉三角规则如下: 1)每行第一个数和最后一个数都为1,其它每个数等于它左上方和右上方的两数之和; 2)第n行有n…

FiftyOne 系列教程(1)FiftyOne简介及跑通官网的demo案例

文章目录 简介demo效果 简介 FiftyOne 是一个数据集管理和模型分析工具,提供灵活的 API 和直观的应用程序,作为开源“数据集的 IDE”。可以非常方便的做出来自己的算法与baseline之间的对比效果图在更多数据集上获得结果,通常是你以前从未使…

logstash同步数据从kafka到es集群

背景:需求是这样的,原始文件是txt文件(每天300个文件),最终想要的结果是每天将txt中的数据加载到es中,开始的想法是通过logstash加载数据到es中,但是对logstash不太熟悉,不知道怎么讲…

数据仓库是什么?什么是列式存储?

事务和分析 在早期的业务数据处理过程中,一次典型的数据库写入通常与一笔 商业交易(commercial transaction) 相对应:卖个货、向供应商下订单、支付员工工资等等。但随着数据库开始应用到那些不涉及到钱的领域,术语 交…

Liunx 套接字编程(2)TCP接口通信程序

1.TCP通信程序的编写 面向连接、可靠传输、提供字节流传输服务 客户端向服务器发送一个连接建立的请求流程,上图中服务端第三步详细流程 2.TCP接口 socket--创建套接字 int socket(int domain, int type, int protocol); bind---绑定 intbind(int sockfd, struct s…

自动化测试工具 —— selenium介绍及基本使用方法

Selenium是一个开源、免费、简单、灵活,对Web浏览器支持良好的自动化测试工具,在UI自动化、爬虫等场景下是十分实用的,能够熟练掌握并使用Selenium工具可以大大的提高效率。 Selenium简介 Selenium支持多平台、多浏览器、多语言去实现自动化…

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——项目复现

文章目录 概述项目复现配置环境下载并配置文件运行代码第一阶段,训练提取DTFR特征的模型资料搜集 train_vqvae.py 第二阶段,使用训练好的模型提取声音的DTFR特征torch.cuda.OutOfMemoryError: CUDA out of memory. 第三阶段,基于特征训练合成…

【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?

对于大部分人而言,支付模块或许是日常生活中最为关注和使用的功能之一,因此,对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息,一旦出现问题可能带来非常严重后果。因此,在支付模块测试…

FastAPI 的路由介绍及使用

上一篇文章中,我介绍了 FastAPI 框架的安装和 HelloWorld 项目搭建方式。本文将介绍如何使用 Router 路由处理 FastAPI 中的请求。 什么是路由 路由 Router 就像是一个流水线上的线长,协调生产,下达命令给不同的组长进行分工,然…

Springboot——事物管理

文章目录 事务管理一、 Spring事务管理1.1 事务回顾1.2 案例: 解散部门(未开启事务)1.3 事务管理注解Transactional1.4 事务管理日志开关1.5 rollbackFor 异常回滚属性1.6 propagation 事务传播行为1.7 解散部门并记录操作日志1.7.1 创建数据…

Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)

New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”,旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据,对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进行了调…

AIGC+实时云渲染:开启3D内容生态的黄金时代

AIGC技术革命下,我们的3D内容生态将会迎来怎样的变化格局? 实时云渲染 / Cloud XR技术将在AIGC大潮中扮演什么样的角色? 作为云基础设施厂商,我们有哪些机会可以抓住? 这些问题已在XR产业、3D内容行业以及软件行业内…

人工智能基础部分18-条件随机场CRF模型的应用

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分18-条件随机场CRF模型的应用,本文将详细介绍条件随机场(CRF)模型,包括其原理、应用场景及实际代码实现。我将通过一个生活中的简单数据样例来演示如何输入数据、运行模型以及…

prometheus监控redis集群并显示到granfana面板

prometheus监控redis集群 监控redis1,在redis机器上安装redis_exporter2,配置prometheus配置文件3,设置redis maxmemory4,导入redis监控模板736 监控redis 1,在redis机器上安装redis_exporter 下载,安装r…

什么是边缘服务器?边缘计算的未来如何?

边缘服务器是指驻留在网络逻辑边缘上的任何类型的服务器,通常位于专用网络和互联网之间。边缘服务器的计算能力正在迅速塑造现代工业格局,动态应用程序和现代业务基础设施的出现使得数据的快速处理和共享成为必然。公司现在正在用边缘服务器技术取代传统…