7、Explain解析SQL语句

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 :用到文件排序 ,需要优化,性能太低,需要扫描磁盘,全盘扫描。

你可能感兴趣的:(MySQL)