<span>MySQL Explain分析执行计算</span>

用法

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement    

explain_type: {
    FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
  | TREE
}

explainable_stmt: {
    SELECT statement
  | TABLE statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

explain 输出的字段含义

Explain执行计划包含字段信息如下:id、select_type、table、partitions、type、possible_key、key、key_len、ref、rows、filtered和Extra 12个字段。

字段 format=json时的名称 含义
id select_id 该语句的唯一标识
select_type 查询类型
table Table_name 表名
partitions partitions 匹配的分区
type Access_type 连接类型
possible_keys possible_keys 可能得索引选择
key key 实际选择的索引
key_len key_length 索引的长度
ref ref 索引的哪一列被引用了
rows rows 估计要扫描的行数
filtered filtered 表示符合查询条件的数据百分比
Extra 没有 附加信息

type 连接类型,有如下几种取值,性能从好到坏排序如下

  • system:该表只有一行,相当于系统表,system是const类型的特例。
  • const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const查询速度非常快,因为它仅仅读取一行数据即可。
  • eq_ref: 当使用了索引的全部组成部分,并且索引是primary key 或unique not null 才会使用该类型,性能仅次于system及const
  • ref: 当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。如果使用的索引实惠匹配到少量的行,性能也是不错的。
  • fulltext: 全文索引
  • ref_or_null:该类型类似于ref,但MySQL会额外搜索哪些行包括了NULL,这种类型常见于解析子查询 sql select * from ref_table where key_column = exp or key_column is null;
  • index_merge:表示使用了索引合并优化
  • unique_subquery:该类型和eq_ref类似
  • index_subquery:与unique_subquery类似
  • range:范围扫描,常见于between、><
  • index:全索引扫描,和ALL类似,只不过index是全哦按扫描了索引的数据。当查询仅使用索引中的一部分列时,可使用此场景。
  • ALL:全表扫描,性能最差。

rows rows:以表的统计信息和索引使用情况,估算要找到所需要的记录,需要读取的行数。

这是评估SQL性能的一个比较重要的数据,mysql需要扫描的行数,可以直观的显示SQL性能的好坏,一般情况下rows值越小越好。

Extra Extra:不适合在其他列中显示的信息,explain中的很多额外的信息都会在extra字段显示。 using index:在相应的select操作中使用了覆盖索引。

覆盖索引:通俗一点来说就是查询的列被索引覆盖,使用到覆盖索引查询速度非常快,SQL优化中理想的状态 using where:查询时未找到可用的索引,进而通过where条件过滤所需数据,但是要注意并不是所有带where语句的查询都会显示 using where using temporary: 表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。 using filesort:表示无法利用索引完成的排序操作,也就是order by 的字段没有索引,通常这样的SQL都是需要优化的。

如果 order by 字段有索引就会用到覆盖索引,相比执行速度快很多。

参考文章

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务