Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >搞定面试官 - 如何查看 SQL 的执行计划?

搞定面试官 - 如何查看 SQL 的执行计划?

作者头像
周三不加班
发布于 2023-03-15 07:45:13
发布于 2023-03-15 07:45:13
1.1K0
举报
文章被收录于专栏:程序猿杂货铺程序猿杂货铺

大家好,我是程序员啊粥,这段时间一直在分享 MySQL 索引系列的文章,我们学会了索引模型 MySQL InnoDB 索引模型,以及和具体的索引使用原则等内容,今天开始我们学习 SQL 的优化。

说起 SQL 优化,我们需要知道一个 SQL 的执行频率,假如说你有一条慢 SQL,好几个月才执行一次,那我觉得你其实也没啥花费精力优化它的必要,毕竟执行频率太低,投入产出比不足。

如何查询 SQL 执行频率

关于查询 SQL 执行频率,我们可以使用 show global status like 'Com___',(这后边是 7 个下划线),这条命令可以显示当前数据库中增删改查等各个语句的使用次数,可以看我,我这个库中,大量的执行语句都是 select 语句,其他语句非常少。

那说明这个库中的查询时比较多的,所以我们需要额外关注查询的效率。

关于具体的查询效率,我们可以通过查询数据库的慢 SQL 日志来查询。

慢查询日志

  • 慢查询日志是否开启:show variables like 'slow_query_log'
  • 开启慢日志:set global slow_query_log = 1; (只对当前会话生效,全局生效需要修改 my.conf 配置文件)
  • 设置慢查询阈值:set global long_query_time = 4
  • 之后就可以在 slow.log 文件中查询到执行的慢 SQL。

这部分基本掌握这几个命令就可以了,我们可以在临时会话中开启慢 SQL 日志,然后执行对应的 SQL 语句来记录日志。

慢查询日志可以帮我们记录具体的慢查询语句,但是为什么慢它是没发告诉我们的,因此,我们还需要借助其他的一些命令来帮助我们具体慢的原因。

使用 MySQL profiling 剖析单条 SQL 查询耗时

  • show profiles 能在做 SQL 优化时帮助我们了解耗时具体耗在了哪里。
  • show prifile for query id 查看具体各个阶段的耗时

这两条命令结合在一起,可以明确告诉我们这条 SQL 在执行中,到底耗时在那一步,比如是某个子查询或者 Server 层数据传输等具体原因。

得出时间消耗在那个环节之后,我们便可以使用具体的执行计划来进行针对性的优化,下边着重介绍一下关于 SQL 执行计划的使用。

通过 Explain 查询执行计划

结果输出展示:

ID

该语句的唯一标识。如果 explain 的结果包括多个 id 值,则数字越大越先执行;而对于相同 id 的行,则表示从上往下依次执行。

Select_type

查询类型,有如下几种取值:

table

表示当前这一行正在访问哪张表,如果 SQL 定义了别名,则展示表的别名

Partitions

当前查询匹配记录的分区。对于未分区的表,返回 Null

Type

连接类型,有如下几种取值,性能从好到坏排序 如下:

  • system:该表只有一行(相当于系统表),system是const类型的特例
  • const:针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可
  • eq_ref:当使用了索引的全部组成部分,并且索引是 PRIMARY KEY 或 UNIQUE NOT NULL 才会使用该类型,性能仅次于 system 及 const。
  • ref:当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。如果使用的索引只会匹配到少量的行,性能也是不错的。
  • fulltext:全文索引
  • ref_or_null:该类型类似于 ref,但是 MySQL 会额外搜索哪些行包含了 NULL。这种类型常见于解析子查询
  • index_merge:此类型表示使用了索引合并优化,表示一个查询里面用到了多个索引
  • unique_subquery:该类型和 eq_ref 类似,但是使用了 IN 查询,且子查询是主键或者唯一索引。
  • index_subquery:和 unique_subquery 类似,只是子查询使用的是非唯一索引
  • range:范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有 BETWEEN 子句或 WHERE子 句里有 >、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。
  • index:全索引扫描,和 ALL 类似,只不过 index 是全盘扫描了索引的数据。当查询仅使用索引中的一部分列时,可使用此类型。有两种场景会触发:
    • 如果索引是查询的覆盖索引,并且索引查询的数据就可以满足查询中所需的所有数据,则只扫描索引树。此时,explain 的Extra 列的结果是 Using index。index 通常比 ALL 快,因为索引的大小通常小于表数据。
    • 按索引的顺序来查找数据行,执行了全表扫描。此时,explain 的Extra 列的结果不会出现 Uses index。
  • ALL:全表扫描,性能最差。

possible_keys

展示当前查询可以使用哪些索引,这一列的数据是在优化过程的早期创建的,因此有些索引可能对于后续优化过程是没用的。

key

表示 MySQL 实际选择的索引。

key_len

索引使用的字节数。由于存储格式,当字段允许为 NULL 时,key_len 比不允许为空时大 1 字节。

ref

表示将哪个字段或常量和 key 列所使用的字段进行比较。

如果 ref 是一个函数,则使用的值是函数的结果。要想查看是哪个函数,可在 EXPLAIN 语句之后紧跟一个 SHOW WARNING 语句。

rows

MySQL 估算会扫描的行数,数值越小越好。

filtered

表示符合查询条件的数据百分比,最大 100。用 rows × filtered 可获得和下一张表连接的行数。例如rows = 1000,filtered = 50%,则和下一张表连接的行数是 500。

以上就是关于 explain 执行计划结果中的字段说明,具体的含义很多都是我从官网直接拿过来的,比较枯燥,当然也不需要你死记硬背,只要你在 SQL 优化过程中,有意识的使用 explain 分析它的执行计划,然后来查阅一下每个字段是什么含义,最后针对具体的问题进行能进行优化,这就可以了。

关于 explain 的具体使用,我会在下一篇文章中进行实战演练,今天就单纯介绍一下这些字段的含义,你有个大概印象就可以。

我是程序员啊粥,让我们一起在技术中向上生长。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员啊粥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL-如何定位慢查询SQL以及优化
定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 SET GLOBAL slow_query_log = ‘ON’;
才疏学浅的木子
2023/10/17
7730
MySQL-如何定位慢查询SQL以及优化
SQL 语句分析 -explain 执行计划详解
实际生产环境中,为了知道SQL语句的执行过程具体,我们可以使用explain + SQL语句来查看。
技能锦囊
2020/05/26
1.4K0
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴。
程序员小富
2020/05/20
8650
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
MySQL执行计划(explain)分析
这里的索引有auditstatus和productid,可以建立联合索引。但是哪个放左边就要计算区分度。
linxinzhe
2018/07/25
1K0
干货|MySQL性能优化的4个小技巧
  MySQL性能优化是一个老生常谈的问题,无论是在实际工作中还是面试中,都不可避免遇到相应的场景,下面博主就总结一些能够帮助大家解决这个问题的小技巧。
IT学习日记
2022/09/13
9740
干货|MySQL性能优化的4个小技巧
实战讲解MySQL执行计划,面试官当场要了我
SELECT标识符。这是查询中SELECT的序列号,表示查询中执行select子句或者操作表的顺序。如果该行引用其他行的并集结果,则该值可为NULL。
JavaEdge
2021/02/22
1.3K0
实战讲解MySQL执行计划,面试官当场要了我
Java如何定位自己项目中的慢业务
我们都知道,在日常开发中我们经常遇到在钉钉群或者在业务群中会出现各种各样的慢业务的接口,比如某个接口在钉钉群疯狂出现,然后就有某些领导艾特你来解决这个慢业务问题,今天阿粉就来说说如何通过各种手段来定位慢业务问题,以及如何解决慢业务的问题。
Java极客技术
2023/02/23
7290
Java如何定位自己项目中的慢业务
深入探索SQL优化:利用慢查询日志和explain提升数据库效率
开始之前推荐一篇实用的文章:《MySQL存储引擎大厂面试经典三连问》,作者:【小白的大数据之旅】。
Lion 莱恩呀
2024/11/29
2530
深入探索SQL优化:利用慢查询日志和explain提升数据库效率
Explain 执行计划 和 SQL优化
在分析查询性能时,考虑EXPLAIN关键字同样很管用。EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作,可以帮助选择更好的索引和写出更优化的查询语句。
星哥玩云
2022/08/17
7310
Explain 执行计划 和 SQL优化
【MySQL】索引性能分析工具详解——>为sql优化(select)做准备
MySQL客户端连接成功后,通过show [sessionlglobal] status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:
YY的秘密代码小屋
2024/09/09
1720
【MySQL】索引性能分析工具详解——>为sql优化(select)做准备
MySQL进阶突击系列(07) 如何分析优化慢SQL | 怎么看执行计划?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。
拉丁解牛说技术
2025/02/05
1320
如何巧用索引优化SQL语句性能?
为什么在 MySQL数据库中,一条慢查询只要添加上合适的索引,查询速度就能提升一个档次?对于 MySQL,如何巧用索引优化SQL语句性能?需要注意什么问题?
每周聚焦
2024/05/30
2290
MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧
一条SQL被一个懵懂的少年,一阵蹂躏,扔向了MySQL服务器的尽头,少年苦苦等待,却迟迟等不来那满载而归的硕果。于是少年气愤,费尽苦心想从度娘那边寻求帮助,面对执行计划EXPLAIN,却等来的是无尽的折磨与抓狂。
xcbeyond
2020/05/14
5.5K0
实战讲解MySQL的expain执行计划,面试官当场要了我
SELECT标识符。这是查询中SELECT的序列号,表示查询中执行select子句或者操作表的顺序。如果该行引用其他行的并集结果,则该值可为NULL。
JavaEdge
2022/11/30
8320
实战讲解MySQL的expain执行计划,面试官当场要了我
mysql执行计划看是否最优
介绍   本篇主要通过汇总网上的大牛的知识,简单介绍一下如何使用mysql的执行计划,并根据执行计划判断如何优化和是否索引最优。   执行计划可显示估计查询语句执行计划,从中可以分析查询的执行情况是否最优,有助于对不使用索引的语句进行优化。EXPLAIN对每个查询返回一行信息,列出了有序的表格,MySQL处理语句的时候读取他们。MySQL解决所有的连接使用嵌套连接方法。这意味读取第一张一行,然后匹配第二张表的所有行,第三张表甚至更多表。当所有的表在处理时,MySQL会输出已经查询出来的列,并且回溯到表继续
用户1217611
2018/03/19
2.1K0
SQL优化思路+经典案例分析
SQL调优这块呢,大厂面试必问的。最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析。
捡田螺的小男孩
2023/02/24
1K0
SQL优化思路+经典案例分析
带你看懂MySQL执行计划
前面文章,我们学习了 MySQL 慢日志相关内容,当我们筛选得到具体的慢 SQL 后,就要想办法去优化啦。优化 SQL 的第一步应该是读懂 SQL 的执行计划。本篇文章,我们一起来学习下 MySQL explain 执行计划相关知识。
MySQL技术
2021/07/05
1.7K0
还不会看MySQL的EXPLAIN执行计划?这篇文章能帮到你
我们在进行SQL优化的时候,主要是看where后面的字段有没有用到索引。如何看这个查询有没有用到索引,那就看Explain执行计划了。
Lvshen
2022/05/05
3390
还不会看MySQL的EXPLAIN执行计划?这篇文章能帮到你
MySQL中SQL执行计划详解
MySQL执行计划是sql语句经过查询优化器后,查询优化器会根据用户的sql语句所包含的字段和内容数量等统计信息,选择出一个执行效率最优(MySQL系统认为最优)的执行计划,然后根据执行计划,调用存储引擎提供的接口,获取数据。
星哥玩云
2022/08/17
3.4K0
MySQL中SQL执行计划详解
MySQL 执行计划详解
​ 在企业的应用场景中,为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。
Parker
2020/07/21
5.4K0
相关推荐
MySQL-如何定位慢查询SQL以及优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档