MySQL调优(一)——Explain详解与索引最佳实践

MySQL EXPLAIN 详解 EXPLAIN 是 MySQL 提供的性能分析工具,用于查看 SQL 查询的执行计划(即优化器如何执行查询)。它通过模拟查询过程(不实际执行 SQL)返回一个表格,展示索引使用、表连接方式、扫描行数等关键信息,帮助开发者诊断性能瓶颈并优化查询。核心作用:基本语法: FORMAT:指定输出格式,默认是表格形式(TRADITIONAL),JSON 格式包含更详细信息。 示例: 输出结果示例:性能瓶颈难以定位索引优化盲目性资源浪费与扩展性问题维护成本高必用 EXPLAIN 的场景:快速优化步骤:通过 EXPL 阅读详情

Explain工具介绍
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中

Explain分析示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行

explain 两个变种
1)explain extended:会在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
mysql> explain extended select * from film where id = 1;
在这里插入图片描述
mysql> show warnings;
在这里插入图片描述
2)explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。

explain中的列
接下来我们将展示 explain 中每个列的信息。
1. id列id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
2. select_type列
select_type 表示对应行是简单还是复杂的查询。
1)simple:简单查询。查询不包含子查询和unionmysql> explain select * from film where id = 2;
2)primary:复杂查询中最外层的 select
3)subquery:包含在 select 中的子查询(不在 from 子句中)
4)derived:包含在 from 子句中的子查询。
MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)用这个例子来了解 primary、subquery 和 derived 类型mysql> set session optimizer_switch=‘derived_merge=off’;
#关闭
mysql5.7新特性对衍生表的合并优化
mysql> explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der;
mysql> set session optimizer_switch=‘derived_merge=on’; #还原默认配置
在这里插入图片描述
5)union:在 union 中的第二个和随后的 selectmysql> explain select 1 union all select 1;
在这里插入图片描述
3. table列
这一列表示 explain 的一行正在访问哪个表。
当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的select 行id。
4. type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL一般来说,得保证查询达到range级别,最好达到refNULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。
例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表mysql> explain select min(id) from film;
在这里插入图片描述
const, system:mysql能对查询的某部分进行优化并将其转化成一个常量(可以看showwarnings 的结果)。用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为systemmysql> explain extended select * from (select * from film where id = 1) tmp;
在这里插入图片描述
mysql> show warnings;
在这里插入图片描述
eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种type。
mysql> explain select * from film_actor left join film on film_actor.film_id = film.id
在这里插入图片描述
ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。

1.简单 select 查询,name是普通索引(非唯一索引)
mysql> explain select * from film where name = ‘film1’;
在这里插入图片描述
2.关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分。
mysql> explain select film_id from film left join film_actor on film.id =film_actor.film_id
在这里插入图片描述
在这里插入图片描述
range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。mysql> explain select * from actor where id > 1;
在这里插入图片描述
index:扫描全表索引,这通常比ALL快一些。mysql> explain select * from film;
在这里插入图片描述
ALL:即全表扫描,意味着mysql需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了
mysql> explain select * from actor;
在这里插入图片描述
5. possible_keys列这一列显示查询可能使用哪些索引来查找。explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。
6. key列这一列显示mysql实际采用哪个索引来优化对该表的访问。如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。
7. key_len列这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。举例来说,film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。
mysql> explain select * from film_actor where film_id = 2;
在这里插入图片描述
8. ref列这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)
9. rows列这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。
10. Extra列这一列展示的是额外信息。常见的重要值如下:
1)Using index:使用覆盖索引
mysql> explain select film_id from film_actor where film_id = 1;
在这里插入图片描述
2)Using where:使用 where 语句来处理结果,查询的列未被索引覆盖
mysql> explain select * from actor where name = ‘a’;
在这里插入图片描述
3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
mysql> explain select * from film_actor where film_id > 1;
在这里插入图片描述
4)Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
1.actor.name没有索引,此时创建了张临时表来distinctmysql> explain select distinct name from actor;
在这里插入图片描述
2. film.name建立了idx_name索引,此时查询时extra是using index,没有用临时表mysql> explain select distinct name from film;
在这里插入图片描述

Explain详解与索引优化最佳实践 扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id) 阅读详情

相关推荐

【MySQL】Explain详解与索引最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句 或 是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。

金鳞踏雨 1774

【MySQL】MySQL Explain性能调优详解

mysql查看性能工具explain中type有很多种,主要的有: 链接类型 说明 system 表只有一行,MyISAM引擎。 const 常量连接,表最多只有一行匹配,通用用于主键或者唯一索引比较时 eq_ref 每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引 ref 如果每次只匹配少数行,那就是比较好的一种,使用=或<=>,可以是左覆盖索引或非主键或非唯一键 fulltex

DreamSun的博客 1354

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3298

Mysql优化——分析查询语句:EXPLAIN(1)

EXPLAIN 分析语句 ,每个字段的含义

Alex_cf的博客 966

squidpy 教程 1:在 AnnData 和 Squidpy 中导入空间数据

这些是 10x Genomics Visium 的 Space Ranger 输出提供的 keys,因此是第一个被采用的 keys。在这种情况下,我们假设空间坐标与像素具有相同的比例,因此我们将该值设置为 1。为此,我们将使用模拟数据集,并通过示例展示您应该注意的重要细节,以便利用 AnnData-Scanpy-Squidpy 生态系统的全部功能。并不是绝对必要的,但会节省您大量的输入,因为它是 Squidpy 和 Scanpy 的默认值。正如你所看到的,空间坐标被缩小了,图像被“放大”了。

🧑‍🎓 博士研究生在读 🔬 分享生物信息学、神经生物学方面的知识 💬 合作请在后台留言 2256

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

MySQL之Sql调优explain关键字详解

引言 数据库性能优化是每个后端程序猿必备的基础技能之一,而Mysql中的explain堪称Mysql的性能优化分析神器,我们可以通过它来分析SQL语句的对应的执行计划在Mysql底层到底是如何执行的,它对于我们评估SQL的执行效率以及确定Mysql的性能优化方向具有重要的意义。 但是很多同学对于如何根据explain对已有SQL进行深度的执行分析还是丈二和尚摸不着头脑,因此本文详细阐述通过explain分析定位数据库性能问题。 explain基础 对于每个SQL来说,当它被客户端发送到Mys

azhou的代码园 4686

激光器安规详细解读 - 一级 - 并以940波长为例

前言: 作为人工智能的重要解决方案,激光作为不可或缺的一个选项。但是,激光的安规问题始终是要得到关注。尤其是3D识别技术在人脸上的使用的时候,如何判读激光器的安全使用规范,变得非常重要。本文,尝试从欧洲激光标准IEC 60825-1:2014,以及国家激光产品规则标准GB 7247.1,抛砖引玉,写出自己的理解。 本节,主要讨论,人脸识别需要符合的安全等级1: 1 激光标准的分类 激光国际...

山云的专栏 5037

mysql explain select,MySQL数据库下的Explain命令深度解析

原标题:MySQL数据库下的Explain命令深度解析Explain是一个非常有的命令,可以用来获取关于查询执行计划的信息,以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性,并不总是会说出真相,但是它的输出是可以获取的最好信息,值得花时间了解,可以学习到查询是如何执行的。调用Explain要使用Explain,只需在查询中的select关键字之...

weixin_42503069的博客 500

从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin

从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十一)spring-boot-admin 监控篇(2)springcloud 集成spring boot admin spring-boot-admin 服务端创建与集成入nacos spring-boot-admin 查看日志

峡谷电光马仔的博客 1385

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6813

MySQL调优--04---explain

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录explain1.概述2. 基本语法3. 执行计划包含的信息4. 数据准备EXPLAIN各列作用1.idid:在一个大的查询语句中每个SELECT关键字都对应一个唯一的id查询优化器可能对涉及子查询的查询语句进行重写,转变为多表查询的操作2.table:表名查询的每一行记录都对应着一个单表3.select_typeSELECT关键字对应的那个查询的类型,确定小查询在整个大查询中扮演了一个什么角色SIMPLE`类型PRIMARY类型S

时光里的博客 740

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程。包括:无人机航测外业作业流程(像控点布设、航线规划、仿地飞行、航拍)和内业数据处理软件(Pix4d、CC、EPS、PhotoScan、Globalmapper)像控点权重调配、空三加密、DOM、DSM、DEM,DLG生成、等高线生成、高程点提取,点云分类过滤分割、点云生成DEM、三维模型生成等。

智慧空间实验室 3960

Mysql优化之Explain详解、索引最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈,在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。

Z_Lisa的博客 1万+

学Simulink——基于Simulink的AUTOSAR架构下电机控制软件组件建模

本文详细介绍了在Simulink中基于AUTOSAR架构开发电机控制软件组件(SWC)的全流程。主要内容包括:首先阐述了AUTOSAR架构对汽车电子系统开发的价值,包括提高软件复用率、降低集成成本和改善验证环境。然后重点讲解了在Simulink中构建电机控制SWC的具体步骤:从创建AUTOSAR组件模型、定义数据端口和服务端口,到搭建FOC控制算法、配置运行实体,最后生成AUTOSAR描述文件和验证RTE接口。文章还提供了与基础软件(BSW)的集成方案、工程实践要点和常见问题解决方案,并以大众MEB平台等实

amy_mhd的博客 68

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

性能调优——15 Explain详解与索引最佳实践

Explain 使用与详解、从B+树底层分析常见索引优化原则、MySQL 索引最佳实践

念头通达 666

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

面试之MySQL调优问题

文章目录前言一、MySQL的底层原理粗解1.1 MySQL的底层运作1.2 MySQL的存储方式二、索引(重点内容)2.1 索引是什么?2.2 MySQL调优到底是调啥的2.3 如何创建一个索引2.3.1在创建表的时候创建索引2.3.2 通过更新语句来创建索引2.4 索引的底层原理2.4.1 使用二叉树来进行模拟索引底层(淘汰)2.4.2 使用红黑树(平衡二叉树)树来进行模拟索引底层(淘汰)2.4.3 使用B树来进行模拟索引底层(淘汰)2.4.4 使用B +树来进行模拟索引底层(选用)3聚集索引与非聚集索引

雍仲的迎客茶庄 4716

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySQL调优之Explain详解与索引优化实践

本文介绍了MySQL的Explain工具及其在SQL调优中的应用。主要内容包括: Explain工具概述:作为MySQL提供的调试工具,帮助开发者了解SQL执行路径,优化查询性能。 基本用法:在SELECT语句前加EXPLAIN关键字获取执行计划信息,展示id、select_type、table等关键指标。 扩展功能: 使用EXPLAIN EXTENDED可获取filtered列(估算查询连接范围) 执行SHOW WARNINGS可查看优化后的SQL语句 示例说明:通过实际表结构(t_user/t_addr

qq_44784918的博客 1207

MySQL EXPLAIN 详解 及 SQL调优实战

MySQL EXPLAIN 详解 及 SQL调优实战

u014212540的博客 2365

Explain详解与索引最佳实践

Explain详解与索引最佳实践

一个想交朋友的陌生人 1295

MySQL EXPLAIN详解与高效调优方法

MySQL EXPLAIN深度调优指南:7大策略提升查询性能。本文详解EXPLAIN的8大核心字段,包括执行顺序、查询类型和关键性能指标,提供索引优化三原则、JOIN优化等6大实战技巧。特别介绍高阶优化方法如索引合并、索引下推,并通过案例展示如何将查询从2800ms优化至45ms。文章还推荐了可视化工具和性能追踪方法,帮助DBA快速定位慢查询问题,实现查询性能指数级提升。

unicorn_dsx的专栏 970

MySQL的Explain详解与索引优化最佳实践

SQL语句优化第n步必做的事

weixin_52465547的博客 1310

Mysql中Explain详解及索引的最佳实践

使用关键字可以模拟优化器执行SQL语句,分析查询语句在 SELECT 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。

薛之谦 2065

MySQL 性能调优入门:EXPLAIN、Profile 与 Trace 的应用

MySQL 作为企业核心 OLTP 数据库之一,其性能瓶颈往往隐藏在一条条“写得没问题但跑得很慢”的 SQL 中。理解执行计划、掌握实际执行代价,是调优的第一步。本文将基于 MySQL 8.0+ 的最新能力,系统讲解 EXPLAIN 的原理与用法、Profile 如何揭示资源消耗细节、Trace 如何重现优化器的决策路径,并通过真实场景案例演示如何协同使用这三大工具精准诊断和优化 SQL 性能。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1472
上一篇: 通俗易懂理解MySQL底层与调优(一)——底层结构
下一篇: MySQL调优(二)——索引最佳实践
快乐小柴
博客等级 码龄7年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值