MySQL 执行计划详解

文章目录

  • 一. 概念
  • 二. 语法
  • 三. 详解各字段
    • 1. id
    • 2. select_type
    • 3. table
    • 4. partitions
    • 5. type
    • 6. possible_keys与key
    • 7. key_len
    • 8. ref
    • 9. rows
    • 10. filtered
    • 11. Extra

一. 概念

有了慢查询后,需要对慢查询语句进行分析。一条查询语句经过MySQL查询优化器后,基于各种成本和规则优化后生成一个所谓的执行计划。

这个执行计划揭露了接下来执行查询的方式。比如多表连接查询的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。

EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EXPLAIN的各个输出项字段的作用,从而可以针对性提升查询语句的性能。

通过EXPLAIN关键字可以模拟优化器执行SQL查询语句,进而知道MySQL如何处理SQL的。分析查询语句或者表结的性能瓶颈,可以通过EXPLAIN解析,如:

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引会被使用
  4. 哪些索引实际被使用
  5. 使用索引实际的字节数
  6. 表之间的引用
  7. 每张表有多少行被优化器查询

二. 语法

执行计划的语句:EXPLAIN + SQL语句

EXPLAIN select * from table

除了select,其余的delete,update,insert,replace语句前都可以加EXPLAIN,用来查询语句的执行计划。

三. 详解各字段

先对explain输出各个列的作用大致罗列下:

  1. id:在一个大的查询语句中每个select关键字都对应一个唯一id
  2. select_type:select *关键字对应的查询的类型。
  3. table:表名。
  4. partitions:匹配的分区信息。
  5. type:针对单表的访问方法。
  6. possible_keys:可能用懂啊的索引。
  7. key:实际用到的索引。
  8. key_len:实际使用到的索引长度。
  9. ref:当使用索引列等值查询时,与索引列进行等值匹配对象的信息。
  10. rows:预估需要扫描的行数。
  11. filtered:某个表经过搜索条件后过滤剩余记录条数的百分比。
  12. Extra:额外的信息。

1. id

id列编号是select的序列号。有几个select就有几个id。

  1. id相同,执行顺序由上到下

    explain select * from a inner join b on a.id = b.id
    

    在这里插入图片描述

  2. id不同,如果子查询,id的序号递增,id值越大优先级越高,越先执行。

  3. id有null最后执行。

    explain select * from a union select * from a;
    

    在这里插入图片描述

2. select_type

代表对应行是简单还是复杂的查询。

⭐️类型:

  1. SIMPLE:简单查询,查询不包含子查询和union。

    explain select * from a;explain select * from a inner join b on a.id = b.id;
    
  2. PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
    在这里插入图片描述

  3. SUBQUERY:select、where之后包含了子查询,在select语句中出现的子查询语句,结果不依赖于外部查询(不在from语句中)。

  4. DEPENDENT SUBQUERY:指在select语句中出现的查询语句,结果依赖于外部查询
    在这里插入图片描述

  5. DEPENDENT SUBQUERY:指在select语句中出现的查询语句,结果依赖于外部查询

    在这里插入图片描述

  6. DERIVED:在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放在临时表中。

    派生表是在一个查询中定义的一个临时表,它由一个子查询生成,但不是作为查询的一部分返回,而是作为外部查询的一部分来引用。派生表通常用在FROM子句中,看起来像是一个普通的表名,但实际上是一个子查询的结果集。

    -- 关闭对衍生表合并优化
    set session optimizer_switch='derived_merge=off';
    -- 查看optimizer_switch参数
    show variables like '%optimizer_switch%';
    -- 
    explain select * from (select * from a) as t; 
    -- 还原表合并优化
    set session optimizer_switch='derived_merge=on';
    

    在这里插入图片描述

  7. UNION:若第二个select出现在UNION后,则被标记为UNION

    explain select * from a union select * from a
    
  8. UNION RESULT:UNION关键字会将数据结果进行去重,会使用一个临时表,临时表的记录会被标记为UNION RESULT

    explain select * from a union select * from a
    
  9. DEPENDENT UNION :当一个UNION操作符连接的查询中,至少有一个查询依赖于外部查询的某个值时,这样的查询被称为DEPENDENT UNION

    explain select * from a where id in (select id from a union select id from a)
    

    在这里插入图片描述

3. table

该行数据属于哪张表。

4. partitions

和分区相关,一般情况下查询语句的执行计划的partitions列的值都是NULL

5. type

执行计划的一条记录代表着MySQL对某个表的执行查询时的访问方法/访问类型.

其中type就表明这个访问方法/访问类型,较为重要的一个指标,结果值从最好到最坏排序:

常用的:

system > const > eq_ref > ref > range > index > all

全type的:

system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。

一般来说至少达到range级别,最好达到ref。

⭐️类型:

  1. system:系统表,少来给你数据,往往不需要磁盘IO。或者当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory

  2. const:当我们根据主键或者唯一索引列等值匹配时。

    explain select * from a where id = 1
    

    在这里插入图片描述

  3. eq_ref:进行多表连接查询,被驱动表通过主键或唯一索引进行等着查询。

    explain select * from a join b on a.id = b.id
    

    在这里插入图片描述

  4. ref:普通二级索引等值查询。

    create index idx_index on a (user_name);explain select * from a where user_name = ''
    

    在这里插入图片描述

  5. ref_or_null:命中索引时,查询条件除了等值查询,还包含null值查询。

    create index idx_index on a (user_name);explain select * from a where user_name = '' or user_name is null;
    

    在这里插入图片描述

  6. index_merge:查询条件命中多个索引情况下

    create index idx_index on a (user_name);
    create index idx_index2 on a (sex);explain select * from a where user_name = '' or sex = 1;
    

    在这里插入图片描述

  7. unique_subquery:查询条件包含子查询,并且子查询的列可以进行主键等值匹配。

  8. index_subquery:查询条件包含子查询,并且子查询的列可以通过索引进行等值匹配。

  9. range:命中索引时,查询某一个范围内的结果。

    create index idx_index on a (user_name);explain select * from a where user_name > '张';
    

    在这里插入图片描述

  10. index:直接在某个索引树上做条件判断,并且不需要回表。

create index idx_index on a (user_name, sex);-- 虽然没满足左前缀,但可以遍历idx_index的B+Tree,找到sex等于1记录
-- 查询结果的user_name在联合索引上,不用回表,此时就可以用index
explain select user_name from a where sex = 1;

在这里插入图片描述

  1. all:直接遍历整个聚簇索引。

    explain select * from a
    

    在这里插入图片描述

6. possible_keys与key

possible_keys代表可能用到的索引。

key代表实际用到的索引。

7. key_len

key_len代表优化器决定使用某个索引执行查询时,该索引记录的最大长度。

计算原理

对于固定长度类型的索引列来说,它实际占用的存储空间的最大长度为该索引的固定值。对于指定字符集的变长类型的索引列来说

如varchar(10),使用的字符集是utf8(1个字符占用3个字节),那么该列实际占用的最大存储空间是10 * 3 + 2 + 1 = 33 byte。

如果可以存储null值,key_len比不可存储NULL多1个字节。对于varchar来说是长度可变字段,还会有2个字节的空间来存储该字段变长列的实际长度。

如int,为4个字节。

如datetime,为6个字节。

MySQL执行计划中输出key_len列柱用为了让我们区分某个使用联合索引的查询具体用了几个索引。

8. ref

这一列表明了在key列记录的索引中,表查找值所用到的列或常量

  1. const 或 NULL:
    • const: 当查询使用常量作为索引查找的键值时,ref 列将显示为 const。这通常发生在查询中使用了常量值(如数字或字符串字面量)作为WHERE子句的一部分。
    • NULL: 当查询不使用索引或者使用全表扫描时,ref 列将显示为 NULL
  2. 表名.列名:
    • 当查询使用某个表的列作为索引查找的键值时,ref 列将显示为 <table_name>.<column_name>。这意味着查询使用了索引查找来定位行。
    • 如果查询涉及到多个表并且使用了某个表的列来查找另一个表中的行,则ref列将显示为前一个表的列名。
  3. func:
    • 当查询使用函数作为索引查找的键值时,ref 列将显示为 func。这通常发生在查询中使用了函数(如LOWER()CONCAT())来处理索引列。
  4. 索引名称:
    • 有时ref列也可能包含索引名称,这通常发生在查询使用了特定索引来查找行。

9. rows

如果查询优化器决定使用全表扫描方式对某个表执行查询时,执行计划的row列的代表的预计需要扫描的行数。

如果使用索引查询,rows代表预计扫描索引行数。

10. filtered

表示在JOIN操作中,前一个表的行数据被过滤的比例。

11. Extra

Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句

  • using index:使用覆盖索引会出现。
  • using where:在查找使用索引情况下,需要回表去查询所需数据。
  • using condition:查找使用了索引,但需要回表查询数据。
  • using index & using where:查找使用了索引,但需要的数据都在索引列中找到,所以不需要回表查询数据

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

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

相关文章

最新 【Navicat Premium 17.0.8】简体中文版破解激活永久教程

官方下载地址&#xff1a; https://www.navicat.com.cn/download/navicat-premium 百度网盘补丁链接 链接: https://pan.baidu.com/s/11hu414Honi3Y9dPQ6-07JQ?pwd04mu 提取码: 04mu 未安装过的用户可直接跳过该步骤&#xff0c;如果已安装Navicat&#xff0c;记得先卸载干净…

阿里云主机 安装RabbitMQ

一、操作系统 用的是Alibaba Cloud Linux release 3 (Soaring Falcon)系统&#xff0c;可以通过命令&#xff1a;lsb_release -a 查看系统信息。 二、安装RabbitMQ RabbitMQ 是基于 Erlang 语言构建的&#xff0c;要安装RabbitMQ&#xff0c;需先安装Erlang环境。通过Erlang V…

【图解网络】学习记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCP/IP 网络模型有哪几层&#xff1f;键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;NAPIHTTP 是什么&#…

Win10出现错误代码0x80004005 一键修复指南

对于 Windows 10 用户来说&#xff0c;错误代码 0x80004005 就是这样一种迷雾&#xff0c;它可能在不经意间出现&#xff0c;阻碍我们顺畅地使用电脑。这个错误通常与组件或元素的缺失有关&#xff0c;它可能源自注册表的错误、系统文件的损坏&#xff0c;或者是软件的不兼容。…

PyTorch 的 .pt 文件是什么?以及都能存储什么样的数据格式和复合数据格式?加载 train.pt 文件的一个代码示例

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、PyTorch 的 .pt 文件是什么&#xff1f; .pt 文件的基本概念&#xff1a; .pt 文件是 PyTorch 中特有的一种文件格式&#xff0c;用于保存和加载各类数据。.pt为 PyTorch 的缩写。此文件格式极其灵…

dotnet-starter-kit:一个Web API+Blazor多租户、模块化、简洁DDD架构!

推荐一个Web APIBlazor多租户、模块化、简洁DDD项目框架。 01 项目简介 dotnet-starter-kit是一个基于 .NET 8 的开源项目&#xff0c;架构构建基于 Clean Architecture 原则的解决方案。支持多租户、模块化&#xff0c;一个开箱即用的项目&#xff0c;方便我们快速开发项目。…

GitEval — 预测你的 GitHub 个人资料的质量

使用机器学习来预测你是否擅长编码 可直接在橱窗里购买&#xff0c;或者到文末领取优惠后购买&#xff1a; 如果你曾经申请过技术职位&#xff0c;你可能已经向公司发送了你的 GitHub 个人资料链接。此个人资料中的信息可以很好地表明你的编码能力以及是否适合团队。所有这些信…

Spring事件机制

文章目录 一、Spring事件二、实现Spring事件1、自定义事件2、事件监听器2.1 实现ApplicationListener接口2.2 EventListener2.3 TransactionalEventListener 3、事件发布4、异步使用 三、EventBus1、事件模式2、EventBus三要素3、同步事件3.1 定义事件类3.2 定义事件监听3.3 测…

[tomato]靶机复现漏洞详解!

靶机地址&#xff1a; https://download.vulnhub.com/tomato/Tomato.ova 靶机环境&#xff1a;Vmware 网络&#xff1a;NAT模式 信息收集&#xff1a; arp-scan -l 扫描靶机ip地址 扫描开放的端口信息 nmap -sS -sV -p- 192.168.77.135 发现开放端口21&#xff…

2024年7月30日 十二生肖 今日运势

小运播报&#xff1a;2024年7月30日&#xff0c;星期二&#xff0c;农历六月廿五 &#xff08;甲辰年辛未月乙未日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、马、猴 需要注意&#xff1a;狗、鼠、牛 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

git 推送时出现错误 Locking support detected on remote “origin“

背景&#xff1a;代码托管是局域网搭建的gitlab 按照提示配置 lfs.locksverify true 还是没有用。 网上搜索了一番&#xff0c;其中有人提到可能时服务器磁盘满了&#xff0c;连到服务器上 df -h 查看&#xff0c; 发现根目录已经写满了&#xff1a; 使用命令行&#xff1a; d…

C/C++进阶 (8)哈希表(STL)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 本文着重于模拟实现哈希表&#xff0c;并非是哈希表的使用。 实现的哈希表的底层用的是线性探测法&#xff0c;并非是哈希桶。 目录 一、标准库中的哈希表 1、unordered_map 2、unordered_set 二、模…

【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!

我们诚挚地邀请您参与第四届区块链技术与信息安全国际会议&#xff08;ICBCTIS 2024&#xff09;。本届会议将于2024年8月17日~19日在中国武汉召开。会议将围绕区块链技术与信息安全等相关研究领域&#xff0c;特邀国内外数位在此领域学术卓越的学者专家做相关致辞与报告&#…

如何使用虚拟机如何安装 Kali Linux ?

1.下载虚拟机&#xff1a;https://www.virtualbox.org/wiki/Downloads 选择你的系统版本 2.下载kali linux系统镜像&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 全部下载完成后&#xff0c;我们会得到以下文件&#xff01; 1.压缩Kali Linux压缩包 2.安…

Django实战:开启数字化任务管理的新纪元

&#x1f680; Django实战&#xff1a;开启数字化任务管理的新纪元 &#x1f310; &#x1f4d6; 引言 在数字化转型的浪潮中&#xff0c;任务管理的智能化成为提升组织效能的关键。今天&#xff0c;我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…

【Opencv】色彩空间 color space

import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) # 在opencv中使用imread,读取的图片每个像素都是bgr色彩&#xff0c;蓝色&#xff0c;绿色&#xff0c;红色 cv2.imshow(img,img) cv2.waitKey(0) # 颜色空间转化&#xff1a;BGR2RGB img_rgb cv2.cvtC…

【Python学习手册(第四版)】学习笔记10-语句编写的通用规则

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单&#xff0c;5-10分钟即可阅读完成。介绍Python基本过程语句并讨论整体语法模型通用规则&#xff08;冒号、省略、终止、缩进、其他特殊情况&#xff0…

【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中&#xff0c;由于传递信号的分析需要&#xff0c;引出了CAN数据帧的ID&#xff0c;长度和数据段的概念&#xff0c;它们都与CAN协议帧相关。CAN协议帧有5种类型&#xff0c;如下表&#xff1a; 而我们当前使用到的是数据帧&#xff0c;故本…

正向解析、反向解析、DNS主从、多区域、ntp时间同步

DNS配置回顾 编号主机名IP地址说明1web服务器192.168.1.17发布部署web服务2dns服务器192.168.1.20用于解析域名和IP地址3clien主机192.168.1.18用于模拟客户机 修改 client主机&#xff1a;修改了dns的访问主机&#xff1b;临时修改echo "nameserver IP地址"&…

【Web开发手礼】探索Web开发的秘密(十三)-Vue(3)好友列表、登录

前言 主要介绍了好友列表、登录界面所涉及的vue知识点&#xff01;&#xff01;&#xff01; 好友列表 从云端API读取数据信息 地址 https://app165.acapp.acwing.com.cn/myspace/userlist/方法&#xff1a;GET是否验证jwt&#xff1a;否输入参数&#xff1a;无返回结果&…