mysql sql 执行分析

MySQL提供分析SQL执行计划的EXPLAIN指令,可判断SQL是否用索引等信息。对于复杂多表关联查询,即便加索引执行速度也可能不理想,此时可控制连接表数量、以小表连大表、加冗余字段,还可考虑数据异构或建‘索引’表,同时介绍了Explain结果分析关注点。

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

Mysql提供分析sql执行计划的指令,我们可以通过它,判断sql语句是否用到了索引、查询的总数及结果的占比,以及一些相关的信息。

实际上,我个人觉得使用explain这条指令可以直观看出有没有使用索引,但实际对应业务上,复杂的多表关联查询也是有的,这种时候就算表连接的字段都加上索引,实际sql的执行速度也不是很理想的,这种时候感觉要控制多表连接的表的数量,尽量以小表连大表,并且可以考虑在表中加一些冗余的字段,来做表关联,还不行的话,可以考虑数据异构或专门写个’索引’表。

Explain结果的分析

字段说明
idsql的执行序号,代表sql的执行顺序,从1开始,子查询的id会递增。
select_typesql语句的类型
tablesql语句涉及的目标表
partitions匹配到的分区
type访问的类型,常见的有ALL(全表扫描)、index(只遍历索引树)、ref(匹配条件中有字段用到了索引)
possible_keys可能用到的索引
key实际用到索引
key_len用到索引的字节数
ref连接条件与索引的关系,const表示连接条件的常量用到了索引
rows总的结果集,结果有多少行
filtered可以简单看成实际结果与结果集行数的占比(这种说法是不太准确的)
Extra一些附加信息,Using index 使用索引、Using temporary 使用临时表、Using filesort 使用排序、Using whereing 使用全表扫描
explain关注点

重点要关注如下几列:

列名备注
type本次查询表联接类型,从这里可以看到本次查询大概的效率。
key最终选择的索引,如果没有索引的话,本次查询效率通常很差。
key_len本次查询用于结果过滤的索引实际长度。
rows预计需要扫描的记录数,预计需要扫描的记录数越小越好。
Extra额外附加信息,主要确认是否出现 Using filesort、Using temporary 这两种情况。
其中,type包含以下几种结果,从上之下依次是最差到最好:
类型 选项说明
ALL执行full table scan,这是最差的一种方式。
index执行full index scan,并且可以通过索引完成结果扫描并且直接从索引中取的想要的结果数据,也就是可以避免回表,比ALL略好,因为索引文件通常比全部数据要来的小。
range利用索引进行范围查询,比index略好。
index_subquery子查询中可以用到索引。
unique_subquery子查询中可以用到唯一索引,效率比 index_subquery 更高些。
index_merge可以利用index merge特性用到多个索引,提高查询效率。
ref_or_null表连接类型是ref,但进行扫描的索引列中可能包含NULL值。
fulltext全文检索。
ref基于索引的等值查询,或者表间等值连接。
eq_ref表连接时基于主键或非NULL的唯一索引完成扫描,比ref略好。
const基于主键或唯一索引唯一值查询,最多返回一条结果,比eq_ref略好。
system查询对象表只有一行数据,这是最好的情况。
另外,Extra列需要注意以下的几种情况:
字段说明
Using filesort将用外部排序而不是按照索引顺序排列结果,数据较少时从内存排序,否则需要在磁盘完成排序,代价非常高,需要添加合适的索引。
Using temporary需要创建一个临时表来存储结果,这通常发生在对没有索引的列进行GROUP BY 时,或者ORDER BY里的列不都在索引里,需要添加合适的索引。
Using index表示MySQL使用覆盖索引避免全表扫描,不需要再到表中进行二次查找数据,这是比较好的结果之一。注意不要和type中的index类型混淆。
Using where通常是进行了全表/全索引扫描后再用WHERE子句完成结果过滤,需要添加合适的索引。
Impossible WHERE对Where子句判断的结果总是false而不能选择任何数据,例如where 1=0,无需过多关注。
Select tables optimized away使用某些聚合函数来访问存在索引的某个字段时,优化器会通过索引直接一次定位到所需要的数据行完成整个查询,例如MIN()\MAX(),这种也是比较好的结果之一。

传送门
https://www.cnblogs.com/xuanzhi201111/p/4175635.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值