Mysql explain 含义及操作实战

explain 可以用来分析该条Sql被执行的情况,是sql优化的必备技能。

有哪些字段

在这里插入图片描述

各个字段的含义

id
这个字段我用来确定执行的顺序。
存在多条时,按数字从大到小执行。同样的数字,由上向下执行。

select_type
这个字段用来表示该条是一个什么类型的,主查询,子查询等。
A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个。
B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个。
C:union:union连接的select查询,除了第一个表外,第二个及以后的表select_type都是union。
D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
H:derived:from字句中出现的子查询。

table
表名,临时表名(,),物化表名()

type
这个我用来判断有无使用到索引,使用到什么类型的索引,是查看重点。
依次从好到差:system,const,eq_ref,ref,range, index, all
以上除all 表示全盘扫描,没有用到索引,其余都用到了索引。
当没有使用索引扫描查找时,就是all

explain select * from book where id	>1;

在这里插入图片描述
index,说明使用到了索引

explain select id from book;

在这里插入图片描述
range,使用索引进行范围查找
Mysql explain 含义及操作实战_第1张图片
ref,使用非唯一索引进行等值查找
Mysql explain 含义及操作实战_第2张图片
eq_ref,唯一索引引用,在多表关联事时使用唯一索引关联时出现。

create table dev_sdwan_gateway.book_info(id int primary key,author varchar(255));

Mysql explain 含义及操作实战_第3张图片
const,常量,使用唯一索引进行等值查询
Mysql explain 含义及操作实战_第4张图片
范围查询依然是range
Mysql explain 含义及操作实战_第5张图片
system,memory或myisam存储引擎所特有,只有一行数据或空数据时显示。

partitions

分区表命中情况,非分区表该值为null

possible_keys

可能使用到的索引,都会显示出来

key

实际使用的索引

key_len

使用到key的长度,可以用来查看使用了多少索引,我是用来在多列索引时方便查看到究竟使用到几列的。

具体计算方式如下:
int 4
允许为null +1
字符串较为复杂,跟字符集和是否允许是否可变长有关。
允许可变长 如varchar 会+2
字符集长度如下Character Set:utf8=3,gbk=2,latin1=1

计算示例

varchr(10)变长字段且允许NULL      : 10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
varchr(10)变长字段且不允许NULL    : 10*(Character Set:utf8=3,gbk=2,latin1=1)+2(变长字段)

char(10)固定字段且允许NULL        : 10*(Character Set:utf8=3,gbk=2,latin1=1)+1(NULL)
char(10)固定字段且不允许NULL        : 10*(Character Set:utf8=3,gbk=2,latin1=1)

ref

如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

rows

执行计划预估的扫描行数,越少越好

extra

这个字段又是一个重点,我用来评估执行性能
using index
使用到了索引,如果只有using index 说明不用回表查询,即使用到了覆盖索引。

using where
说明使用到了where 筛选,并且进行回表查询。

using filesort
使用文件排序,说明此时使用了order by 排序,且排序过程并没有通过索引直接排序,而是通过更为耗性能的文件排序。我认为遇到这个值,需要关注和优化。

Using temporary
使用了临时表,一般在多表关联时。性能影响较大,需要关注和优化。

以上

你可能感兴趣的:(性能优化,mysql)