Explain select * from tb_test;
这个字段意思是查询类型,它有很多个值,这里就只介绍几种常见的值:
(1)simple: 简单查询不包含子查询或union;
(2)primary: 复杂查询最层的select;
(3)subquery: 在from之前的子查询;
(4)derived: 在from之后的子查询(相当于是创建了一个临时表);
例子:
EXPLAIN select (select 1 from tb_test where id = 1) from (select id from tb_user where id = 1) der;
如上图可见select_type里每一个字段后面table里面就是对应的他查询的表,而且上面的sql语句查询的顺序会根据查询的出来的结果id最大的优先查询,这里查出来的id有可能还是一样的,如果是一样的,就从上往下依次查询。
这个字段个人觉得在这explain分析里面是比较重要的,可根据他的值进行sql优化,他的几个常见的值是 system
EXPLAIN select * from (select * from tb_test WHERE id = 1) sub
EXPLAIN select ur.* from user_role ur
left join role r on r.id = ur.role_id
EXPLAIN select * from user where name = 'zyl'
EXPLAIN SELECT * FROM `test` where name > 'qwe'
EXPLAIN SELECT name FROM test;
EXPLAIN SELECT * FROM test;
这个字段意思是查询可能会用到的索引,因为查询中mysq底层的优化器会优化我们的查询语句,例如我们范围查询时,范围过大,在这种条件下全表扫描是会比索引查询更快的,所以这里可能就不会用到索引查询。
EXPLAIN SELECT * FROM test where name > '1';
如上图所示,可能会用到索引index_name,但是我们会发现key这个字段下是没有值得,这就是因为mysql底层优化器的原因。
查询会用到的索引,会展示在这里。
EXPLAIN SELECT * FROM test where name = '1';
这个字段意思就是索引字段的字节数,比如设置主键为int类型,字节数大小应该是4,通过主键索引查出来的数据如下图:
EXPLAIN SELECT * FROM test where id = 1;
以下列举mysql常见类型的字节大小:
类型 | 字节大小 |
---|---|
char(n) | n |
vachar(n) | 如果是utf-8,长度为3n+2,加的2字节是用来存储字符串长度 |
tinyint | 1 |
smallint | 2 |
bigint | 8 |
date | 3 |
timestamp | 4 |
datetime | 8 |
如果允许字段为空,还会需要1字节来记录是否为空。
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索 引。
EXPLAIN SELECT name FROM test where name = '1';
name类型为vachar(10),按照上面的算法3n+2,字节大小为32,
查出来会发现大小为33,这里就是加1个字段来存储是否为空
这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:test.id)。
这一列mysql估计要查询的行数,不是从结果集里面取出来的,只是个估计值。
这一列展示的信息也是比较重要的,常见的重要值如下:
覆盖索引概念:select后面的查询字段能直接从这课b+树上获取,不需要再经过回表查询获取结果。这一般针对的就是辅助索引或者说二级索引。
EXPLAIN SELECT name FROM test where name = '1';
EXPLAIN SELECT * FROM test where name > '2';
EXPLAIN select * from user where name > '1'
EXPLAIN select DISTINCT name from test;
EXPLAIN select * from test ORDER BY name ;
EXPLAIN select name from test ORDER BY name
EXPLAIN select max(name) from test ;
EXPLAIN select name from test where name = 'zyl'
使用联合索引时要从索引的最左列开始查而且不可跳过中间的某一个。因为按B+树的原理来说,如果不使用最左前缀法则,底层数据是不能排序的,是走不了索引的。虽然在mysql里面不按照最左前缀法则写sql有可能会走索引,那是因为mysql底层的优化器将sql优化了一遍的,这也是需要耗费资源时间的。
EXPLAIN select * from user where name = 'zyl' and age = 18 and birth_date > '2020-01-1';
EXPLAIN select * from user where birth_date > '2020-01-1' ;
EXPLAIN select * from test where left(name,3) = 'zyl';
EXPLAIN select * from user where name = 'zyl' and age = 18 and birth_date > '2020-01-1';
EXPLAIN select * from user where name = 'zyl' and age > 18 and birth_date = '2020-01-1';
EXPLAIN select name from test where name = 'zyl'
EXPLAIN select * from test where name != 'zyl';
EXPLAIN select * from test where name is not null
EXPLAIN select * from test where name like '%zyl';
EXPLAIN select * from test where name = 1;
EXPLAIN select * from test where name in ('zyl','zl');