mysql explain 关键字输出与解释

explain是mysql 分析执行语句性能快慢的关键步骤。

一 explain select 语句输出项

CLOUME表头信息 JSON 字段 字段含义
id select_id The SELECT identifier(查询语句Id)
select_type None The SELECT type (查询类型)
table table_name The table for the output row(输出行的表)
partitions partitions The matching partitions(匹配的分区)
type access_type The join type(连接类型)
possible_keys possible_keys The possible indexes to choose(可选择的索引)
key key The index actually chosen(实际选择的索引)
key_len key_length The length of the chosen key(所选索引的长度)
ref ref The columns compared to the index(与索引比较的列)
rows rows Estimate of rows to be examined(待检查行的估计量)
filtered filtered Percentage of rows filtered by table condition(按表条件筛选的行百分比)
Extra None Additional information(附加信息)

二 select_type 说明

SIMPLE :简单的sql语句(没有使用union关键字和子查询的sql语句)
PRIMARY:最为层条件查询(最关键的查询语句)
UNION :联合查询中的第二个或者更高查询语句
DEPENDENT UNION :联合查询中第二或者更高查询语句以来外部语句
UNION RESULT:从 union 临时表检索结果的 select
DEPENDENT SUBQUERY:
DERIVED:物理表
MATERIALIZED
UNCACHEABLE SUBQUERY:一个子查询,其结果不能被缓存,必须为外部查询的每一行重新计算.
UNCACHEABLE UNIONunion中存在不可缓存sql语句
rows×filtered显示将与下表联接的行数

三 types 说明

system :表中存在一行记录(const join 特例)
const:表最多有一个匹配行,该行在查询开始时读取
eq_ref
fulltext:使用FULLTEXT 索引的查询类别
ref_or_null

SELECT * FROM ref_table
  WHERE key_column=expr OR key_column IS NULL;

unique_subquery
index_subquery
index_merge:表示使用了索引合并的优化方法。
range: using any of the =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN() 等查询条件下。
index:使用索引查询条件
(1)如果索引是查询的覆盖索引,并且可以用于满足表中所需的所有数据,则只扫描索引树。在这种情况下,额外的一列表示使用索引。仅索引扫描通常比全部扫描快,因为索引的大小通常小于表数据。
(2)使用从索引中读取的数据按索引顺序查找数据行来执行完整表扫描。Uses index不出现在额外的列中。
ALL:全表扫描类型

四 Extra列信息说明

1 distinct: 一旦找到了与行相联合匹配的行,就不再搜索了
2 Using index:发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。
3 Using where:mysql在存储引擎检索行后再进行过滤。就是先读取整行数据,再按 where 条件进行检查,符合就留下,不符合就丢弃。
4 Using temporary:mysql服务需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化
5 Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。一般也是要考虑使用索引来优化的
6 Using index condition :通过访问索引元组并首先测试它们以确定是否读取完整的表行来读取表。索引下推。
7 **Using where ** 使用where 条件过滤查询语句
8 Using where with pushed condition
9 Zero limit : 无任何行输出sql语句

参考文献: 1 https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
2 https://cloud.tencent.com/developer/article/1093229

你可能感兴趣的:(mysql,数据库,索引,sql)