Mysql-执行计划Explain

列名 意义
id
select_type SELECT语句查询的类型
table 查询列的出处
partitions 如果是分区表,表示从哪个分区查,非分区表为null
type 表和前一张表的关联方式。也可以说是当前这张表会怎么去查询
possible_keys 查询的时候可能被使用的索引
key mysql真正决定用来查询的索引,(可以不是上面possible_keys中的值)
key_len 存储的索引的长度
ref 从哪儿取值
rows 需要查询的行数
filtered
Extra

type描述的是在每个表的查询中如何连接的,既join。一个sql查询可能涉及到多个表的相互连接。从最好的到最差的。

  • system
    这个表只有一行(既系统表),这是const类型的一种特殊形式
  • const
    这个表最多只有一行符合条件的匹配的行,而且是第一个被查询的table,因为只有一行数据,这行里面的各个列的值可以被当做constants常量,被后面的优化器使用。
    当我们用一个确定的值去和主键或者唯一索引去比价时,mysql就是const。(因为他可以直接在b+tree里快速找到此值,只需要一次从顶到底的查找)。注意必须是索引的全部,而不是部分。所以当我们的查询是主键/唯一索引等号比较时,是最快的。只需要一次查找即可。
  • eq_ref
    跟const其实是一样的,不过他不是第一个被查询的,而是被其他表连接的时候。假设学生表和地址表一对一,下面这个sql输出中,注意第二行查找address表时的type就是eq_ref。也就是说每次student表查找到一条后,再去查address表的时候,只需要查找一次。因为查找address表用的是前一张student表的user中的address的主键。
    EXPLAIN SELECT * FROM student LEFT JOIN address ON student.addr_id = address.id;

`

  • ref
    代表当期表数据查找并非基于主键或者唯一非空索引(既不能准确的找到唯一的一个值)

  • fulltext
    长文本索引相关

  • ref_or_null
    类似ref,但是查询需要再来一遍去查询对应列内容为null的数据行。如下:

    SELECT * FROM ref_table
      WHERE key_column=expr OR key_column IS NULL;
    
  • unique_subquery
    eq_ref 用于in条件子句

  • index_subquery
    任然是用于in条件子句,只不过相对于unique_subquery这种查询代表着非unique的in条件

  • range
    range代表着无法确定个数的范围查询,走索引查询。在以下条件中都可能用到。
    =,<>,>,>=,<,<=,IS NULL,<=>,BETWEEN,LIKE,IN()

  • index
    扫描表用的是索引时,显示此字段。具体又分2种情况。
    1.覆盖索引。需要的列在索引中有,此时Extra列会显示using index,不需要进行全表扫描。
    2.使用了索引,但是还是需要走到叶子节点,读取具体的表数据。这种情况Extra列不会显示using index
    MySQL can use this join type when the query uses only columns that are part of a single index.

  • all
    全表扫描。既扫描条件没有现成的索引,查询只能通过扫描表得到数据。是最差的情况。

Extra

这个列会文本化提供一些关键信息,用于优化考虑。
比如出现 Using filesortUsing temporary应该重点小心。
Range checked for each record (index map: N)

你可能感兴趣的:(Mysql-执行计划Explain)