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%,则表示没有任何扫描的行符合查询条件

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用html画一个睡觉的熊动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>睡觉的熊动画</title><link rel"stylesheet" href"./style.css"> </head><body><div id"contain…

通过抖音短视频获客 只需要六步

抖音是当前最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和强大的社交矩阵&#xff0c;已经成为企业打造品牌口碑和快速获客的一种有效方式。那么&#xff0c;如何利用抖音短视频快速获客&#xff0c;打造品牌口碑呢&#xff1f;小马识途营销顾问简要分析如下&#…

Vue+OpenLayers7入门到实战:OpenLayers加载wkt格式数据,OpenLayers解析wkt格式的要素数据并渲染到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上加载并解析wkt格式数据,以及渲染wkt格式的要素数据到地图上的功能。 使用Point(点)、(LINESTRING)线,和(POLYGON)多变形的wkt数据进行演示。 wkt介绍请参考博主…

【模拟】Leetcode 提莫攻击

题目讲解 495. 提莫攻击 算法讲解 前后的两个数字之间的关系要么是相减之差 > 中毒时间 &#xff0c;要么反之 那即可通过示例&#xff0c;进行算法的模拟&#xff0c;得出上图的计算公式 class Solution { public:int findPoisonedDuration(vector<int>& time…

论文DOI号相关及在latex中添加DOI跳转

DOI与ISBN, ISSN的不同之处 图书和期刊内容都使用DOI。 与ISBN和ISSN不同的是&#xff0c;ISBN喝ISSN可以识别图书或期刊&#xff0c;DOI可以识别单个章节或单篇文章。 所以&#xff0c;如果要搜寻某本书籍&#xff0c;需要用到的是ISBN号&#xff1b;如果要搜寻某本期刊&…

ESXi 无法启动NTP守护进程

在VMware ESXi环境中如果遇到无法启动NTP&#xff08;Network Time Protocol&#xff09;守护进程的问题&#xff0c;可以通过以下步骤进行排查和解决&#xff1a; 步骤1&#xff1a;检查与修复配置文件 登录到ESXi Shell&#xff08;SSH&#xff09;。编辑 /etc/ntp.conf 配…

Boost电感的作用

Boost电感在Boost升压电路中起着关键的作用。Boost电路是一种DC-DC电源转换器&#xff0c;其主要功能是将低电压直流&#xff08;DC&#xff09;信号转换为高电压直流&#xff08;DC&#xff09;信号。Boost电感在这个过程中起着平滑电流、储存能量和提高电路效率的作用。 具体…

C++初级----list(STL)

1、 list介绍 1.1、 list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 1. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一…

文件操作;

目录 1.文件的打开与关闭&#xff1b; 打开文件&#xff1b; 关闭文件&#xff1b; 2.文件的打开方式&#xff1b; “r”&#xff08;只读&#xff09;&#xff1b; “w”&#xff08;只写&#xff09;&#xff1b; 3.文件的顺序读写&#xff1b; 字符输入函数fgetc 代…

【智能排班系统】Quartz结合Cron-Utils自定义时间发送上班、休息提醒

文章目录 Quartz&#xff1a;强大的Java作业调度引擎Quartz概述核心概念与架构配置文件主配置&#xff08;配置主要调度器设置、事务&#xff09;线程池配置&#xff08;调整作业执行资源&#xff09;SimpleThreadPool特定属性自定义线程池 RAMJobStore配置&#xff08;在内存中…

人工智能揭示矩阵乘法的新可能性

人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时&#xff0c;即使像乘法矩阵&#xff08;二维数字表&#xff09;这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性&#xff0c;但也很诱人。除了魔方…

基于GIS、python机器学习技术的地质灾害风险评价与信息化建库应用

结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重建…

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…

JavaScript之分时函数、分时间段渲染页面、提高用户体验、参数归一化、高阶函数、分段、appendChild、requestIdleCallback

MENU 前言效果图html原始写法优化方式一(参数归一化)优化方式二(当浏览器不支持requestIdleCallback方法的时候)优化方式三(判断环境) 前言 当前需要向页面插入十万个div元素&#xff0c;如果使用普通的渲染方式&#xff0c;会造成延迟。这时候就需要通过分时函数来实现渲染了。…

[element] 简单封装一个表格展示

简单封装 如果你想呈现一个表格,直接复制案例的话是这样的,圈出来的你需要写进入,麻烦 这时候把需要显示的列数据弄成一个对象数组, 给它列名和标题就行 记得这个prop和源数据的prop要对应!! const columns [{label: "日期",prop: date},{label: "姓名",…

【管理咨询宝藏72】MBB大型城投集团能源板块行业分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏72】MBB大型城投集团能源板块行业分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…

通讯录的实现(顺序表)

前言&#xff1a;上篇文章我们讲解的顺序表以及顺序表的具体实现过程&#xff0c;那么我们的顺序表在实际应用中又有什么作用呢&#xff1f;今天我们就基于顺序表来实现一下通讯录。 目录 一.准备工作 二.通讯录的实现 1.通讯录的初始化 2.插入联系人 3.删除联系人 4.…

Arthas实战教程:定位Java应用CPU过高与线程死锁

引言 在Java应用开发中&#xff0c;我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。 准备工作 首先&#xff0c;我们创建一个简单的Java应用&#xff0c;模拟CPU过高和线程死锁的情况。在这个示例中&#xff0c;我们将编写一个…

OpenHarmony C/C++三方库移植适配

简介 众所周知&#xff0c;C/C三方库相对与JS/ETS的三方组件来说&#xff0c;其运行效率高。那如何将一个C/C三方库移植到OH系统上呢&#xff1f;本文将介绍如何快速高效的移植一个C/C三方库到OpenHarmony上。 C/C三方库适配问题与解决方案 由上图可以看出&#xff0c;三方库…

Ypay源支付前端美化模板

功能&#xff1a; 首页加了运行时间&#xff0c;加了首页一言打字效果&#xff0c;加了访问次数&#xff0c;还有底部也适当的加了一点美化 而且加了一个播放器功能&#xff0c;可以自定义歌曲之类的 完美契合于源支付 直接上传主题包使用即可 演示图: 使用: 请不要在后台…