explain分析执行计划的指标字段
explain分析执行计划的指标字段
字段 | 含义 |
---|---|
id | select查询的序列号,是一组数字,表示查询中执行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 | 执行情况的说明和描述 |
前置动作:先分析表关系
逆向表到模型
示例
EXplan分析计划的id字段
id字段是select查询的序列号,是一组数字,表示的是查询中执行select子句或是操作表的顺序。
字段 | 含义 |
---|---|
id | select查询的序列号,是一组数字,表示查询中执行select子句或操作表的顺序 |
id情况有3
种:
1.id相同表时加载表的顺序是从上到下
2.id值越大,优先级越高
3.id值有相同和不同
ID相同的为一组,从上往下顺序执行;
在所有组中,ID值越大,优先级越高。
EXplan分析计划的select_type字段
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(简单查询)
PRIMARY(主查询)和SUBQUERY(子查询)
-- SUBQUERY:在select和WHERE中包含子查询
explain SELECT * FROM role WHERE rid=(SELECT rid FROM user_role WHERE uid=(SELECT uid FROM user WHERE uname='张飞'));
DERIVED(衍生查询)
UNION(连接查询)和UNIONRESULT(连接查询结果)
EXplan分析计划的type字段
type
显示的是访问类型
,是较为重要的一个指标
,可取值
为:性能
结果值从高
到低
依次是:system
> const
> eq_ref
> ref
> range
> index
> ALL
。
type | 含义 |
---|---|
NULL | MySQL不访问任何表,索引,直接返回结果 |
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不访问任何表
system访问系统表
const命中主键(Primary key)
或唯一(unique)索引
命中主键(Primary key)
或唯一(unique)索引
;被连接
的部分是一个常量(const)值
;
eq_ref左表有主键且左表的每行和右表每行刚好匹配
range范围查询
index和ALL
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个字节
。
列类型 | KEY_LEN | 备注 |
---|---|---|
id int | key_len = 4+1 =5 | 允许NULL,加1-byte |
id int not null | key_len = 4 | 不允许NULL |
user char(30) utf8 | key_len = 30*3+1 | 允许NULL |
user varchar(30) not null uft8 | key_len = 30*3+2 | 动态列类型,加2-byte |
user varchar(30) uft8 | key_len = 30*3+2+1 | 动态列类型,加2-byte;允许NULL,再加1-byte |
detail text(10) uft8 | key_len = 30*3+2+1 | TEXT列截取部分,被视为动态列类型,加2-byte;且允许NULL |