sql性能分析之EXPLAIN

2017-06-28  本文已影响0人  king_阿飞

EXPLAIN提供了有关如何执行SQL语句的信息,用于select,delete,insert,update,replace等语句中。在select语句中使用EXPLAIN将返回一行信息(每个表对应一行,包含临时表),按照处理语句时的顺序显示。存在表连接时,使用循环嵌套的方式解析所有连接,也就是说从第一个表中读取一行然后在第二个表中匹配所有符合条件的行,然后再在第三个表……。当所有的表处理完后,输出选中的列并且返回表清单直到找到一个有更多匹配行的表。从该表读入一行并继续处理下一个表。EXPLAIN的输出包含分区信息,对于select语句和DESCRIBE相似(通常情况下DESCRIBE用于获取表结构的信息,而EXPLAIN用于语句的执行计划,即解释如何执行查询)。

EXPLAIN输出列

每行输出代表一个表的相关信息,包含以下字段(JSON 名称为使用FORMAT=JSON时的key)

Column JSON名称 说明
id select_id SELECT标识
select_type SELECT类型
table table_name 输出行所应用的表
partitions partitions 匹配分区
type access_type 连接类型
possible_keys possible_keys 可能选择的索引
key key 实际选择的索引
key_len key_length key的长度
ref ref The columns compared to the index
rows rows 估计要扫描的检查的行数
filtered filtered 按条件过滤行的百分比
Extra 附加信息
select_type 值 JSON 名称 说明
SIMPLE 简单select语句 (未使用子查询和union)
PRIMARY 最外层select
UNION union语句中的第二个往后的select语句
DEPENDENT UNION dependent (true) union语句中的第二个往后的select语句, 取决于外层查询
UNION RESULT union_result 一个union的结果
SUBQUERY 第一个子查询
DEPENDENT SUBQUERY dependent (true) 第一个子查询,取决于外层查询
DERIVED 派生表 (from 子句中的子查询)
MATERIALIZED materialized_from_subquery 物化子查询(子查询通常缓存在内存或临时表里)
UNCACHEABLE SUBQUERY cacheable (false) 不能将子查询结果缓存并且必须对外部查询的每一行重新评估
UNCACHEABLE UNION cacheable (false) 第二个往后的unioon不可缓存子查询(见UNCACHEABLE SUBQUERY)

注:在查询缓存中子查询的缓存行和查询结果的缓存不同,子查询缓存发生在查询期间,而查询缓存在查询完成后才进行存储结果。具体查询如何缓存,请参照:https://dev.mysql.com/doc/refman/5.7/en/query-cache-operation.html

上一篇 下一篇

猜你喜欢

热点阅读