ID列
id 列的编号是select的序号,有几个select就有几个id , id列越大,优先级越高
select_type列
select_type对应的是简单查询和复杂查询
解析SQL:
explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;
1)simple 单表查询
2)DERIVED 包含在 from 子句中的子查询,生成的临时表,也叫派生表
3)SUBQUERY 包含在select中的子查询,不在from子句中
4)PRIMARY 复杂查询,table列为 为 from子句中的派生表名+id
type列
这一列表示关联类型和访问类型,决定性能的列,决定在MYSQL中查询的行。
性能从优到劣分别为: system>const>eq_req>req>range>index>where
- const :MySQL 能确定的只查出一条数据。比如 :Primary Key 和 unique key 。主键和唯一索引
- system : system只是const中的一个特例
- eq_ref:
解析SQL:explain select * from film_actor left join film on film_actor.film_id = film.id;
简单的select 不会出现这种级别的访问类型。 eq_ref只出现在关联查询上。
Primary Key 和 unique key 索引的所有部分被连接,最多只会返回一条符合条件的记录。。例如:film.id 是film表中的主键ID,只会返回一条
- ref:
解析SQL:explain select * from film where name = “film1”;
相比eq_ref 只匹配一条记录,ref的查询类型是,不适用主键索引和唯一索引,查出来的值,还会和 film1 去比较。可能会查出多条。
- range 查询条件是 in , > < between 通过索引(B+Tree索引是有序的数据结构)查出给定范围的行,SQL语句的优化,需要优化到 range级别就可以了
- index 扫描所有索引
- All 扫描所有数据行,扫描硬盘。
possible_key
这个是MYSQL 给出的可能使用的索引
key
这个是SQL语句真正使用到的索引。如果没使用到索引,显示为null
key_len
key的字节长度
- varchar(n) : utf-8 varchar每个字符占3个字节,存储字符的长度占2个字节 例如 varchar 为10 ,则 长度为 2*n +2 =32
- tinyint 1个字节
- smallint 2个字节
- int 4个字节
- bigint 8个字节
- date 3个字节
- datestamp 4个字节
- datetime 8个字节
如果字段允许为null ,则是否为null 占用1个字节
rows列
MySQL 预估的查询的行数,不是真实的查询行数,如果这个行数太大,接近表的行大小,需要重新设计表,设计索引
Extra 列
- Using index : 用到索引,查询的列为覆盖索引
- Using where : 查询的列未被索引覆盖,通常用select * ,where 语句查询没有被索引,或者不是联合索引的前导列
- Using where Using index :查询的列是覆盖索引的列,但是where 后的查询条件,没有被索引,或者不是联合索引的前导列
- Using temporary: 用到临时表。需要优化,关联查询、union 、order by、 group by 会创建临时表,性能低下
- Using filesort :用到文件排序 ,需要优化,性能太低,需要扫描磁盘,全盘扫描。