86.MYSQL执行计划详细解读

本文详细解读了MySQL执行计划的各个字段含义,重点分析了select_type和type,以及extra的重要性。通过理解这些内容,可帮助优化SQL性能并避免全表扫描。同时,也提到了EXPLAIN的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MySQL执行计划

MySQL执行通过使用explain select ....; 或者explain extended select ....; 获得。

在MYSQL5.7之后可以获得DML语句的执行计划。

2.mysql执行计划中各个字段的含义

id:执行顺序。
select_type:查询中每个select子句的类型。
table:表的名字。
partitions:表分区名字。
type:表示要对表进行表扫描类型。
possiable_keys:表示能使用哪个索引找到行记录。
key:表示mysql决定使用的索引(键)。
key_len:表示mysql决定使用索引的长度。
ref:表示使用哪个列和key一起从表中选择行。
rows:表示mysql认为它执行查询时必须检查的行数。
filtered:指返回结果的行占需要读到的行(rows列的值)的百分比。
extra:表示查询的详情信息,用到where ,临时表,排序。

id:相同为一组:从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。

3.重点分析SELECT_TYPEextra ,type 字段的内容

--select_type:
1.simple:简单select,不使用union或子查询。
2.primary:查询中若包含任何复杂的子部分,最外层的select
3.union:union中的第二个或后面的select语句。
4.dependent union:union中的第二个或后面的select语句,取决于外面的查询
5.union result:从union表获取结果的select 
6.subquery:在select 或where 列表中包含了子查询。
7.dependent subquery:子查询中第一个select,取决于外面的查询。
8.derived:派生的select,from 子句的子查询,用来表示包含在from 子句中的子查询的select,
	mysql会递归执行并将结果放到一个临时表中。
9.uncacheable subquery:子查询结果不能被缓存,必须重新评估外链接的第一行。

--type:  重点关注
all:full table scan,mysql将遍历全表以找到匹配的行。
index:full index scan,索引全扫描,mysql遍历整个索引来查找匹配的行。
range:索引范围扫描,常见于<,<=,>,>=,between等操作符。
ref:使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。
eq_ref:使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配。
const,system:单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的
	其他列中的值可以被优化器在当前查询中当作常量来处理。
null:mysql不用访问表或者索引就直接能找到结果。
type:=const,system是最优的。



--Extra:
using index:该值表示相应的select操作中使用了覆盖索引:covering index,
using where :表示mysql服务器将在存储引擎检索行后再进行过滤。许多where 
	条件里涉及索引中的列,当它读取索引时,就能被存储引擎检验。
using temporary:表示mysql需要使用临时表(基于内存的)来存储结果集。
	常见于排序和分组查询。
using filesort:mysql中无法利用索引完成的排序操作称为"文件排序"
using join buffer:该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区
	来存储中间结果。如果出现了这个值,可能需要添加索引来改进性能。
impossiable where :这个值强调了where 语句会导致没有满足条件的行。
select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从
	聚合函数结果中返回一行。
index merges:当mysql决定要在一个给定的表上使用超过一个索引的时候,就会出现
	以下格式中的一个,详细说明使用的索引以及合并的类型。
using MRR:multi-range read:多范围读MRR,它的作用针对基于辅助/第二索引的查询,减少随机IO。
	并且将随机IO转化为顺序IO,提高查询效率。 

4.其他执行计划列的解释

--type/rows 来看避免全表扫描。

--possible_keys:
指出mysql使用哪个索引在表中找到记录,查询涉及到的字段若存在索引,
则该索引将被列出,但不一定被查询使用。

--key:用了哪个索引。
--key_len:
表示索引中使用的字节数,可通过该列计算查询中使用的索引的
长度:不损失精确性的情况下,长度越短越好。

--ref:
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
--rows:
表示mysql根据表统计信息及索引选用情况,估算的找到所需的记录
所需要读取的行数。

--filtered:
在使用explain extended时出现,它显示的是针对表里符合条件的
记录数的百分比所做的一个悲观估算值。

5.Explain 查看执行计划的局限性

EXPLAIN 不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
EXPLAIN 不考虑各种Cache
EXPLAIN 不能显示MySQL 在执行查询时所作的优化工作
EXPALIN 部分统计信息是估算的,并非精确值。
EXPALIN 在5.7 之前的版本只能解释SELECT 操作,5.7 之后可以解析DML 操作。

6.总结

        MYSQL 的执行计划对于MySQL的性能优化非常重要,熟练解读执行计划的内容能够帮助我们快速优化MYSQL 的SQL性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值