MySQL Explain分析执行计算
用法
{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 whereusing temporary
: 表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。using filesort
:表示无法利用索引完成的排序操作,也就是order by 的字段没有索引,通常这样的SQL都是需要优化的。
如果 order by 字段有索引就会用到覆盖索引,相比执行速度快很多。
参考文章