mysql 查询性能分析_使用explain来分析MySQL 查询性能

本文详细介绍了如何使用explain分析MySQL SQL查询的执行计划,包括select_type、table、type等关键列的含义,并强调了全表扫描(all)的负面影响,以及如何通过优化索引来提升查询效率。

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

为了在MySQL中写出高效的SQL脚本,我们的SQL必须时时都要用explain来检查其执行计划,时时调整。

explain 的使用方法为:

explain [sql语句]

比如下面这条SQL

explain select *

from tbl_leihuantong t1 join tbl_tangsuan t2 on t1.id = t2.id;

在MySQL执行完以后如下所示:

id select_type table type possible_keys key key_len ref rows Extra

1SIMPLE t1 ALL PRIMARY NULL NULL NULL 336Using filesort

1SIMPLE t2 eq_ref PRIMARY PRIMARY4 db_apple.t1.id1NULL

下面说一下这些列都代表什么:

select_type:查询类型

simple:除子查询和union外的查询

primary:子查询的最外部查询

subquery:子查询内层查询的第一个Select,不依赖于外部的查询结果集

uncacheable subquery:结果集无法缓存的子查询

dependent subquery:子查询内层查询的第一个Select,依赖外部的查询结果

union:union语句中第二个Select开始及后面的所有Select,Union语句中第一个Select的类型是Primary

union result:Union中的合并结果

dependent union:子查询中的Union,也是union中从第二个select开始往后的所有select,且依赖于外部查询的结果集

table:这一步所访问的数据库中的表的名称。

type:表查询时使用的查询方式,非常重要,主要看这个属性的内容来确定SQL的问题。

system:系统表,表中只有一行数据;

const:读常量,最多只会有一条记录匹配;

eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键来访问;

ref:两个表join时,被驱动表使用索引查询;

ref_or_null:在ref的基础上再对空值进行检查;

index:索引扫描;

index_merge:一个查询中使用了两个索引,对这两个索引的结果进行合并,再读取表数据;

index_subquery:子查询中返回的结果字段组合是一个索引,但不是主键或唯一索引;

unique_subquery:子查询中返回的结果字段组合是主键或唯一索引;

range:使用索引进行范围查询;

fulltext:全文检索;

all:全表扫描,最慢,数据量大时尽量避免,前台表禁止出现这种情况;

possible_keys:查询时可能使用的索引,此项极其重要,分析SQL执行计划时一定要注意到它;

key:这是MySQL的查询优化器从possible_keys中挑的一个索引;

key_len:被选中当索引的字段的长度;

ref:通常是const或者是用来过滤用的某个表的字段,如两个表Join时的键;

rows:MySQL查询优化器估算出来的结果集的大小;

Extra:具体每一步执行时的细节信息;

Using where:不查全表数据,或者仅通过索引还不能查询出全部所需的数据时会出现;

Using index:仅通过使用索引就能查询出所需的数据;如果字段过多,除了查索引,还得回到表中取数,就会出现Using where了。

Using temporary:使用到了临时表,通常在order by 或 group by 时会出现;

Using index for group-by:同Using index,如果分组字段也在索引中,就会出现Using index for group-by;

Select tables optimized away:查询时,在建了索引的字段时使用聚合函数如Count Min Max 等,MySQL优化器会通过索引一次定位到结果数据上面。注:如果使用group by 语句就不行了。

Using filesort :使用Order by时,无法通过索引完成排序,MySQL就需要选择排序算法来排,就会出现这个;

Distinct:查找Distinct值时,MySQL查到第一个匹配的结果后就不再找这个值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值