explain分析执行计划的指标字段

explain分析执行计划的指标字段

image.png
image.png
image.png

字段含义
idselect查询的序列号,是一组数字,表示查询中执行select子句操作表顺序
select_type表示select的类型,常见的取值有SIMPLE(简单表,即不使用表连接或子查询),PRIMARY(主查询,即外层的查询),UNION(UNION中的第二个或后面的查询语句),SUBQUERY(子查询中的第一个select)等。
table输出结果集的表
type表示表的连接类型,性能由高到低的连接类型为(system–>const -->eq_ref -->ref -->ref_or_null -->index_merge -->index_subquery -->index–>all)
possible_keys表示查询时,可能使用的索引
key表示实际使用的索引,如果为NULL,则没有使用索引
key_len表示索引字段字节数长度,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。``
rows扫描行的数量
extra执行情况的说明和描述

image.png


前置动作:先分析表关系

逆向表到模型
image.png
image.png


示例

image.png


EXplan分析计划的id字段

id字段是select查询的序列号,是一组数字,表示的是查询中执行select子句或是操作表的顺序。

字段含义
idselect查询的序列号,是一组数字,表示查询中执行select子句或操作表的顺序

id情况有3种:


1.id相同表时加载表的顺序是从上到下

image.png
image.png


2.id值越大,优先级越高

image.png
image.png


3.id值有相同和不同

ID相同的为一组,从上往下顺序执行;
在所有组中,ID值越大,优先级越高。
image.png
image.png


EXplan分析计划的select_type字段

image.png

select_type含义
SIMPLE(简单查询)简单的select查询,查询中不包含子查询或UNION
PRIMARY(主查询)查询中若包含任何复杂子查询,最外层查询为主查询(PRIMARY)
SUBQUERY(子查询)在select或where列表中包含子查询
DERIVED(衍生查询)载from列表中包含的子查询,被标记为DERIVED(衍生),mysql会递归执行这些子查询,把结果放在临时表中
UNION(连接查询)若第二个select出现在UNION之后,则标记为UNION;若UNION包含在FROM子句的子查询中,外层select将被标记为:DERIVED(衍生)
UNIONRESULT(连接查询结果)从UNION表获取结果的select

SIMPLE(简单查询)

image.png


PRIMARY(主查询)和SUBQUERY(子查询)

-- SUBQUERY:在select和WHERE中包含子查询
explain SELECT * FROM role WHERE rid=(SELECT rid FROM user_role WHERE uid=(SELECT uid FROM user WHERE uname='张飞'));

image.png


DERIVED(衍生查询)

image.png


UNION(连接查询)和UNIONRESULT(连接查询结果)

image.png
image.png


EXplan分析计划的type字段

type显示的是访问类型,是较为重要的一个指标可取值为:
性能结果值从依次是:system > const > eq_ref > ref > range > index > ALL

type含义
NULLMySQL不访问任何表,索引,直接返回结果
system系统表,少量数据,往往不需要进行磁盘IO,如果是5.7及以上版本,就不是system,而是all即使只有一条记录。
const命中主键(Primary key)唯一(unique)索引被连接的部分是一个常量(const)值
eq_ref对于前表的每一行,后表只有一行被扫描。
(1) jion查询;
(2) 命中主键(Primary key)非空唯一(unique not null)索引;
(3) 等值连接
ref非唯一性索引扫描,返回匹配某个单独值的所有行。对于前表的每一行(row),后表可能有多余一行的数据被扫描。
range只检索给定返回的行,使用一个索引来选择行。where之后出现between and<>in等操作。
index需要扫描索引上的全部数据。
all全表扫描,此时Iid上无索引。

NULl不访问任何表

image.png
image.png


system访问系统表

image.png


const命中主键(Primary key)唯一(unique)索引

命中主键(Primary key)唯一(unique)索引被连接的部分是一个常量(const)值
image.png


eq_ref左表有主键且左表的每行和右表每行刚好匹配

image.png


range范围查询

image.png


index和ALL

image.png


EXplan分析计划的其他指标字段


table指标字段

table输出结果集的表

显示这步所访问数据库中的表名``有时不是真实表名,可能是简称


rows指标字段

rows扫描行的数量

key指标字段

possible_keys表示查询时,可能应用在这张表的索引,一个或多个
key表示实际使用的索引,如果为NULL,则没有使用索引
key_len索引字段长度,它的单位为字节
key_len不等于索引字段的长度,而是等于所有被索引字段的长度之和
key_len可以帮助我们了解MySQL使用了多少字节索引键
该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,
索引字段越短,索引的效率就越高

key_len被索引字段的长度之和

key_len是指索引字段的长度单位字节
当MySQL使用索引处理查询时,key_len用来查看MySQL使用了多少字节的索引键。索引字段越短,索引效率就越高。因此,在设计索引时,应该尽量减少索引字段的长度,以提高查询的性能。

注意key_len不等于索引字段的长度,而是等于所有被索引字段的长度之和
例如:如果一个索引包含两个字段,一个占用10个字节,另一个占用20个字节,则key_len将等于30个字节
image.png

列类型KEY_LEN备注
id intkey_len = 4+1 =5允许NULL,加1-byte
id int not nullkey_len = 4不允许NULL
user char(30) utf8key_len = 30*3+1允许NULL
user varchar(30) not null uft8key_len = 30*3+2动态列类型,加2-byte
user varchar(30) uft8key_len = 30*3+2+1动态列类型,加2-byte;允许NULL,再加1-byte
detail text(10) uft8key_len = 30*3+2+1TEXT列截取部分,被视为动态列类型,加2-byte;且允许NULL

image.png
image.png


extra字段

image.png


Using filesort文件排序–效率低

image.png


Using temporary临时表暂存中间结果–效率低

image.png


Using index从索引树返回–效率高

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值