86.MYSQL执行计划详细解读

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

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性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值