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.rhkb.cn/news/313108.html

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

相关文章

【数据挖掘】实验8:分类与预测建模

实验8&#xff1a;分类与预测建模 一&#xff1a;实验目的与要求 1&#xff1a;学习和掌握回归分析、决策树、人工神经网络、KNN算法、朴素贝叶斯分类等机器学习算法在R语言中的应用。 2&#xff1a;了解其他分类与预测算法函数。 3&#xff1a;学习和掌握分类与预测算法的评…

大数据------JavaWeb------JDBC(完整知识点汇总)

JDBC 定义 全称为Java数据库连接&#xff08;Java DataBase Connectivity&#xff09;&#xff1a;是使用java语句来操作所有关系型数据库的一套API JDBC本质 它是官方定义的一套操作所有关系型数据库的规则&#xff08;即接口&#xff09;&#xff0c;各个数据库厂商会去实现…

Day 16 Linux服务管理和日志管理

服务管理 启动服务&#xff1a;systemctl start 服务名 停止服务&#xff1a;systemctl stop 服务名 重启服务&#xff1a;systemctl restart 服务名 重新加载配置文件&#xff1a;systemctl reload 服务名&#xff08;期间并不停止服务进程&#xff09; 查看服务运行状态…

pycharm/idea专业版过期永久解决

1、在file-settings-plungins中找到设置 2、点击增加如图网址3、下载安装此插件 4、按照如下步骤操作即可 5、如果又过期了重复4步骤即可&#xff0c;idea编辑器也是如此操作

如何用ChatGPT进行论文撰写?

原文链接&#xff1a;如何用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384e6…

深度学习 Lecture 9 信息增益、One-hot、回归树、集成树、随机森林、XGBoost模型

一、信息增益&#xff08;Information Gain) 决定使用什么特征来划分一个节点取决于什么样的特征选择最能减少熵&#xff08;也就是使纯度最大化&#xff09; 在决策树中&#xff0c;熵的减少被称为信息增益。 所以如何选择呢&#xff1f; 假设现在有三个特征可以选择&#…

政安晨:【深度学习神经网络基础】(十一)—— 激活函数的导数以及在反向传播中的应用

目录 线性激活函数的导数 Softmax激活函数的导数 S型激活函数的导数 双曲正切激活函数的导数 ReLU激活函数的导数 如何在反向传播中应用 批量训练和在线训练 随机梯度下降 反向传播权重更新 选择学习率和动量 Nesterov动量 政安晨的个人主页&#xff1a;政安晨 欢迎…

Go 语言中的 GIF 图像处理完全指南:`image/gif`的技术与实践

Go 语言中的 GIF 图像处理完全指南&#xff1a;image/gif的技术与实践 概述安装与基础设置导入 image/gif 包初步配置示例&#xff1a;设置一个简单的 GIF 编码环境 读取与解码 GIF 图像读取 GIF 文件解析 GIF 数据 创建与编码 GIF 图像创建 GIF 图像编码 GIF 图像 处理 GIF 动…

中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏

在《愿神》的提瓦特大陆上&#xff0c;每一位冒险者都拥有自己的独特力量——“神之眼”&#xff0c;他们借助元素之力探索广袤的世界&#xff0c;解决谜题&#xff0c;战胜敌人。而在提瓦特的科技树中&#xff0c;存在着一项名为“协同程序”的高级秘术&#xff0c;它使冒险者…

使用Canal同步MySQL 8到ES中小白配置教程

&#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680; 文章目录 &#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680;**摘要****引言****正文**&#x1f4d8; 第1章&#xff1a;初识Canal1.1 Canal概述1.2 工作原理解析 &#x1f4d8; 第2章&…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重&#xff0c;在优化过程中我们会见到很多网站出现秒收的情况&#xff0c;发布的文章几分钟就可以收录&#xff0c;这个通过SITE语法都可以去查询&#xff0c;那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

Real3DPortrait照片对口型,数字人,音频/视频驱动数字人

先看效果 上传一张图片和一段音频&#xff0c;照片如下&#xff1a; 合成后效果如下&#xff1a; 照片对口型-音频驱动 支持音频驱动和视频驱动&#xff0c;视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…

PVE grub resue错误修复 lvmid BUG

服务器断电后启动不起来&#xff0c;显示grub resue 找了半天没有找到修复方法。看官方文档有一处Recovering from grub “disk not found” error when booting from LVM 极为类似。https://pve.proxmox.com/wiki/Recover_From_Grub_Failure 下面是处理过程。 使用PVE 6.4启…

单例模式详解

什么是单例模式 首先&#xff0c;单例模式是一种设计模式&#xff0c;按字面意思&#xff0c;指一个类只能创建一个对象&#xff0c;当创建出多个对象的时候&#xff0c;就会出现报错异常 单例模式为何出现&#xff1f; 1.资源共享:某些情况下&#xff0c;多个对象都需要共享一…

双向链表也叫双链表

双向链表也叫双链表 双向链表也叫双链表 每个节点都有两个指针&#xff0c;分别指向 直接前驱节点、直接后继节点 双向链表中任意一个节点&#xff0c;都可以通过通过它的前驱节点和后继节点&#xff0c;访问其他节点 节点如下 节点定义 ListNode // 节点的值 T element; /…

康谋技术 | 深入探讨:自动驾驶中的相机标定技术

随着自动驾驶技术的快速发展&#xff0c;多传感器的数据采集和融合可以显著提高系统的冗余度和容错性&#xff0c;进而保证决策的快速性和正确性。在项目开发迭代过程中&#xff0c;传感器标定扮演着至关重要的角色&#xff0c;它位于数据采集平台与感知融合算法之间&#xff0…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展&#xff0c;用于创建图形&#xff0c;其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中&#xff0c;数据可视化和统计建模是两个不同的阶段&#xff1a;可视化通知建模&#xff0c;而建模又可以建…

【FreeRTOS】使用CubeMX快速移植FreeRTOS工程到蓝桥杯开发板(STM32G431RBT6)

使用CubeMX快速创建FreeRTOS工程到蓝桥杯开发板&#xff08;STM32G431RBT6&#xff09; CubeMX配置CubeMX基础工程的配置☆FreeRTOS相关配置FreeRTOS配置选项卡的解释 软件工程架构与程序设计小综合&#xff1a;任务的创建删除、挂起与恢复设计cubexMX配置创建任务软件程序设计…

工业自动化,3D视觉技术3C薄片自动化上料

随着制造业的快速发展&#xff0c;3C行业对薄片类零件的上料需求日益增长。传统的上料方式往往依赖于人工操作&#xff0c;效率低下且存在误差。为了解决这一问题&#xff0c;3D视觉技术应运而生&#xff0c;为3C薄片自动化上料提供了强大的技术支持。本文将探讨3D视觉技术如何…

HarmonyOS开发实例:【分布式手写板】

介绍 本篇Codelab使用设备管理及分布式键值数据库能力&#xff0c;实现多设备之间手写板应用拉起及同步书写内容的功能。操作流程&#xff1a; 设备连接同一无线网络&#xff0c;安装分布式手写板应用。进入应用&#xff0c;点击允许使用多设备协同&#xff0c;点击主页上查询…