MySQL Explan执行计划详解

Explan执行计划

首先我们采用explan执行计划 执行一条sql,发现返回了12个列,下面会详细解释每一列

1、ID列

id列的值是代表了select语句执行顺序,是和select相关联的;id列的值大的会优先执行,如果id列为空最后执行,id列相同,则从上到下以此执行

2、select_type列

代表查询的类型,有如下几个值:

2.1 simple:

不包含子查询和join关键字

explan select * from home_attr

2.2 primary:

复杂查询最外层select语句或者union语句中最左边的select

EXPLAIN select *,(SELECT id from home_group where home_id = 8955) from home_attr;

最外层查的表就是home_attr,所以home_attr对应的就是PRIMARY

2.3 subquery:

仅限在from面前的select语句,不包括select后面的雨具

EXPLAIN select *,(SELECT id from home_group where home_id = 8955) from home_attr;

2.4 derived:

衍生表,如果from子句后面包含select语句,则会产生这种类型,他会把中间结果存放在临时表中,但是在5.7中需要使用 set session optimizer_switch='derived_merge=off';关闭mysql对衍生表的合并优化,我们先看下不关闭之前,我们执行如下sql的情况:

EXPLAIN select (select 1 from home_attr where id = 8955) from (select * from home_group where id =  1) der;

发现查询类型没有derived,我们关闭优化看下

set session optimizer_switch='derived_merge=off';
EXPLAIN select (select 1 from home_attr where id = 8955) from (select * from home_group where id =  1) der;

发现出现了derived的查询了

2.5 union

在union中的第二个和随后的select

EXPLAIN select 1 union select 2 union select 3

3、table列

table列代表当前select语句正在查询那张表

EXPLAIN select id from home_attr union select id from home_group

4、type列(主要是查看sql有没有使用索引,重要的字段之一)

type列的值分别为:

NULL >system >const >eq_ref >ref >range >index >ALL,执行效率依次递减

  1. ALL: 表示需要对全表进行全表扫描,即对表中的每一行进行检查。这是最慢和最耗费资源的访问类型。
  2. INDEX: 表示通过索引进行扫描,但仍需要读取索引中的数据行,通常结果比ALL快。
  3. RANGE: 表示通过索引进行范围扫描,即只扫描满足一定条件范围内的数据。
  4. REF: 表示使用非唯一索引来查找匹配某个常数值的行,通常用于连接操作。
  5. EQ_REF: 类似于REF,但是使用的是唯一索引。
  6. CONST: 表示通过常量条件获取单个行,这是最好的情况
  7. system: 表示该查询只会返回一行结果,这是一个非常快速的访问类型。通常情况下,system类型在对系统表或者虚拟表进行查询时出现。系统表是MySQL内部使用的表,通常存储了关于数据库本身的元数据信息。由于系统表的设计使得查询非常快速,因此system访问类型代表着高效的查询操作
  8. NULL: 表示无法归类到任何其他访问类型,可能是由于查询中包含了子查询或者函数等复杂操作而导致无法精确分类。在某些情况下,NULL类型可能意味着需要进一步优化查询以避免性能问题

4.1 NULL:

代表查询在mysql能够在优化阶段分解查询语句的时候直接能完成,不需要查询表和索引,例如获取逐渐最大列或最小列:

EXPLAIN select min(id),max(id) from home_attr

Select tables optimized away:代表从表中就能获取结果

4.2 system:

如果要达到system级别,那么它必须要达到以下几个条件:

1、是系统表或者是临时表

2、表中有且只有一条记录

我们在mysql数据库中找到了proxies_priv表,我们来看 执行以下sql:

EXPLAIN select * from proxies_priv

可以看出已经到了system级别:

还有一种情况就是:派生表(临时表)

4.3 const:

当where后面是一个主键或者唯一索引与一个常量精确比较时,mysql会把查询优化为常量查询,执行以下sql:

EXPLAIN select * from home_attr where id = 8955

我们可以看一下mysql内部进行了什么样的优化:

EXPLAIN select * from home_attr where id = 8955; show WARNINGS;

可以看出mysql直接将其转换为常量进行查询

4.4 eq_ref:

主键或者唯一索引与其它表或字段进行关联查询,最多只会返回一条记录,如下代码:

EXPLAIN select * from home_attr right join home_loan on home_attr.id = home_loan.home_id

可以看出访问home_loan表的时候,type达到了eq_ref级别,因为home_id字段在home_loan表中是唯一的,所以查询home_loan表的时候按照home_id查询只会有一条记录与其关联

4.5 ref:

相对于eq_ref,ref只需要要求是普通索引或者联合索引的前缀匹配

普通索引查询

EXPLAIN select * from home_attr where home_title = '整租·浦东大道2511弄 2室1厅 南';

联合索引前缀匹配

EXPLAIN SELECT home_attr.id FROM home_loan left join  home_attr USE INDEX (index_name) ON home_loan.home_id = home_attr.id;

4.6 range:

范围索引,通常为in、> < >= 这样的比较符,会达到range级别:

EXPLAIN select * from home_attr where home_attr.id > 8955

4.7 index:

扫描全表索引:所查询的列都创建了索引,但是没有按照索引字段过滤(除了让索引失败的操作除外)

4.8 all:

扫描全表,通常情况下,是没有创建索引,需要增加索引优化

EXPLAIN select * from home_attr

5、possible_keys列

这一列显示查询可能使用哪些索引来查找。explan时可能出现possible_keyss这列,而key显示NULL的情况,这种情况是因为表中的数据不多,mysql认为索引对此查询帮助不大,选择了全表查询,如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查where子句看是否可以创建一个适当的索引来提高查询性能,然后用explan查看效果。

6、key列:

趣-列显示mysql实际采用哪个索引来优化对该表的访问。如果没有使用索引,则该列是NULL。如果想强制 mysql使用或忽视possible_keys列中的索引,在查询中使用force index, ignore index。

7、key_len列

该列记录了使用索引的长度,一般用来判断联合索引是否全部生效的作用,该值是根据不同数据类型进行计算的。

key_len计算规则如下:

7.1 字符串

char(n):n字节长度

varchar(n):2字节存储字符串长度,如果utf-8,则长度3n+2

7.2 数值类型

tinyint:1字节

smallint:2字节

int:4字节

bigint:8字节

7.3 时间类型

date:3字节

timestamp:4字节

datetime:8字节


如果字段允许为NULL,需要1字节记录是否为NULL,索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。

8、ref列

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:home_attr.id)

9、rows列

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数

10、Extra列

这个展示索引的额外信息,主要字段信息如下:

  • Using index: 查询的字段被索引覆盖
  • using where where:后面的字段没有使用被创建索引,优化方式,创建索引。
  • using index condition: 查询的语句中,where条件中是一个前导列的范围
  • using temporary:创建临时表,mysql查询过程中需要创建临时表来辅助查询,像这种情况是需要优化的。通过给去重的字段添加索引,可达到优化的效果
  • using filesort:数据排序的时候没有通过索引排序,当数据量小时通过内存排序,大的时候在磁盘中进行排序,需要进行索引优化,通常是排序字段没有创建索引
  • select tables optimized away:直接从表信息就能得到结果

11、Partitions列(分区)

partitions 字段显示了查询所涉及的表使用了哪些分区。在分区表中,数据会根据一定的规则被分割存储在不同的分区中,这有助于提高查询性能和维护数据。partitions 字段显示了这些分区信息,帮助你了解查询操作涉及的具体分区情况

12、Filtered列(过滤率)

filtered 字段用于表示在表扫描后进行筛选条件的效果。它是一个百分比值,表示在表扫描后经过条件过滤后剩余的记录比例。如果 filtered 值为 100%,则表示所有扫描的行都符合查询条件;如果 filtered 值为 0%,则表示没有任何扫描的行符合查询条件

到这里就结束啦,希望这篇文章可以帮助到你!!!感谢大家的支持

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

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

相关文章

数据库的创建

数据库分类 通过查看对象资源管理器来区分数据库类型 数据库物理文件的组成 : 数据库文件 日志文件 创建一个主数据文件和一个日志文件

上线流程及操作

上节回顾 1 搜索功能-前端&#xff1a;搜索框&#xff0c;搜索结果页面-后端&#xff1a;一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索&#xff0c;如果数据量很大&#xff0c;直接使用mysql&#xff0c;效率非常低--》E…

淘宝商品数据抓取新策略:API接口助力获取标题、分类与店铺名

随着电子商务的迅猛发展&#xff0c;淘宝作为中国最大的网络购物平台&#xff0c;其商品数据对于众多商家、研究者和市场分析师来说具有极高的价值。然而&#xff0c;如何高效、准确地抓取淘宝商品数据&#xff0c;尤其是商品标题、分类和店铺名等关键信息&#xff0c;一直是一…

nginx部署上线

1. windows配置nginx 打包命令 npm run build:prod 1. 安装 nginx mac windows 2. mac / windows 环境下ngnix部署启动项目 2. nginx 解决 history 的 404 问题 3. nginx配置代理解决生产环境跨域问题

极速、易用、高度定制化的开源社区交流平台:Flarum

Flarum&#xff1a;轻盈高效&#xff0c;引领未来社区互动新风尚的革命性论坛平台- 精选真开源&#xff0c;释放新价值。 概览 Flarum是一款精心打造的现代网站讨论平台&#xff0c;以其精炼高效而著称。作为 esoTalk 和 FluxBB 的理念和技术的集大成者&#xff0c;Flarum 致力…

Ubuntu 20.04 LTS 在3588安卓主板上测试yolov8-1.0版本的yolov8n-seg模型

0. 创建虚拟环境 #!< 创建虚拟环境yolov8 $ sudo pip install virtualenv $ sudo pip install virtualenvwrapper $ mkvirtualenv yolov8 -p /usr/bin/python3.81. 将yolov8n-seg.pt转换为yolov8n-seg.onnx文件 #!< 创建项目目录yolov8-rknn并下载yolov8n-seg.pt模型文…

虚拟机vm桥接模式linux(centos,ubuntu)联网

台式机网线 查看宿主机网络 编辑虚拟机—>虚拟网络编辑器–>更改设置 选择&#xff0c;确定 进入linux系统 输入ip addr找到自己的网卡 我的是eno16777736 centos&#xff1a; 编辑 HWADDR"00:0C:29:54:CE:B8" TYPE"Ethernet" BOOTPROTO"…

公网IP多少钱可以购买?

公网IP是指可以在全球范围内访问和识别的唯一IP地址。对于许多企业和个人用户来说&#xff0c;公网IP是实现远程访问、搭建服务器、建立安全连接等重要需求的基础。公网IP的获取并不是免费的&#xff0c;并且价格因供应商和地区而异。 现有公网IP市场 当前&#xff0c;市场上有…

博弈论和sg函数

Nim游戏 题目链接&#xff1a;Nim游戏 先说结论&#xff1a;假设n堆石子&#xff0c;石子数分别为a1,a2,a3.....&#xff0c;则当a1^a2^a3^...^an0时先手必败&#xff0c;否则先手必胜。 因为所表示的二进制位必定是成对出现的&#xff0c;根据性质 1 ^ 1 0 &#xff0c;0 …

深入理解 pytest Fixture 方法及其应用

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…

【Pytorch】Conv1d

conv1d 先看看官方文档 再来个简单的例子 import torch import numpy as np import torch.nn as nndata np.arange(1, 13).reshape([1, 4, 3]) data torch.tensor(data, dtypetorch.float) print("[data]:\n", data) conv nn.Conv1d(in_channels4, out_channels1…

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

【Git】git命令大全(持续更新)

本文架构 0.描述git简介术语 1.常用命令2. 信息管理新建git库命令更改存在库设置获取当前库信息 3.工作空间相关将工作空间文件添加到缓存区&#xff08;增&#xff09;从工作空间中移除文件&#xff08;删&#xff09;撤销提交 4.远程仓库相关同步远程仓库分支 &#xff08;持…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时&#xff08;container runtime&#xff09;&#xff1b;想讲清楚他们两之间的关系&#xff0c;让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI&#xff08;open container initiative&#xff09; OCI是容器标准化组织为了…

利用动态规划优化10年投资回报:策略、证明与算法分析

利用动态规划优化10年投资回报&#xff1a;策略、证明与算法分析 a. 存在最优投资策略的证明b. 最优子结构性质的证明c. 最优投资策略规划算法设计d. 新限制条款下最优子结构性质的证明 在面对投资策略规划问题时&#xff0c;我们的目标是在10年后获得最大的回报。Amalgamated投…

牛客 NC205 跳跃游戏(三)【中等 贪心 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/14abdfaf0ec4419cbc722decc709938b 思路 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** …

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…