Mysql的explain,你真的会用吗?(一)

laomugua
发布于 2022-6-7 16:56
浏览
0收藏

 

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

 

explain基础
对于每个SQL来说,当它被客户端发送到Mysql服务端之后,会经过Mysql的优化器部件的分析,主要包括一些特殊的处理、执行顺序的改变以确保最优的执行效率,最终生成对应的执行计划。所谓的执行计划,实际就是在存储引擎层面如何获取数据的,是通过索引获取数据还是进行全表扫描获取数据,获取到数据后需不需要回表,等等,简单理解就是Mysql获取数据的过程。

接下来我们来详细看下,这个explain到底是何方神圣,为什么能指导我们进行性能优化。当我们执行如下语句:

explain SELECT * FROM user_info where NAME='mufeng'explain SELECT * FROM user_info where NAME='mufeng'

执行explain语句之后,我们会得到如下的执行结果,这个类似数据库表的12个字段实际上就是对Mysql执行怎样的执行计划的详细描述。下面我们来好好研究下这12个字段分别代表什么意思,只有搞清楚它们的含义,我们才能明确Mysql到底是怎么执行数据查询的。

Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区

1、id

实际上每次select查询都会对应一个id,它代表着SQL执行的顺序,如果id值越大,说明对应的SQL语句执行的优先级越高。在一些复杂的查询SQL语句中常常包含一些子查询,那么id序号就会递增,如果出现嵌套查询,我们可以发现最里层的查询对应的id最大,因此也优先被执行。

Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区

如上图所示,SQL查询语句中,第一个执行计划的id为1,第二个执行计划的id为2,id为1的执行计划对应的table为order,id为2的执行计划对应的table是user_info,结合SQL语句,我们知道先执行子查询select id from user_info,而后再执行关于表order的数据查询。

 

2、select_type

select_type表示的执行计划的对应的查询是什么类型,常见的查询类型主要包括普通查询、联合查询以及子查询等。SIMPLE(查询语句为简单的查询不包含子查询)、PRIMARY(当查询语句中包含子查询的时候,对应最外层的查询类型)、UNION(union之后出现的select语句对应的查询类型会标记此类型)、SUBQUERY(子查询会被标记为此类型)、DEPENDENT SUBQUERY(取决于外面的查询 )。

Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区

3、table

table代表表名称,表示要查询哪张表。当然不一定是真实的表的名称,也可能是表的别名或者临时表。

 

4、partitions

partitions代表的是分区的概念,表示在进行查询时,如果对应的表存在分区表,那么这里就会显示具体的分区信息。

 

5、type

type是非常核心的属性,需要重点掌握。它表示的是当前通过什么样的方式对数据库表进行分访问。

Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区
 (1)system

该表只有一行(相当于系统表),数据量很小,查询速度很快,system是const类型的特例。

(2)const

如果type是const,说明在进行数据查询的时候,命中了primary key或唯一索引,此类数据查询速度非常快。

Mysql的explain,你真的会用吗?(一)-鸿蒙开发者社区

文章转自公众号:慕枫技术笔记

分类
标签
已于2022-6-7 16:56:20修改
收藏
回复
举报
回复
    相关推荐