explain是mysql 分析执行语句性能快慢的关键步骤。
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(附加信息) |
SIMPLE :简单的sql语句(没有使用union关键字和子查询的sql语句)
PRIMARY:最为层条件查询(最关键的查询语句)
UNION :联合查询中的第二个或者更高查询语句
DEPENDENT UNION :联合查询中第二或者更高查询语句以来外部语句
UNION RESULT:从 union 临时表检索结果的 select
DEPENDENT SUBQUERY:
DERIVED:物理表
MATERIALIZED
UNCACHEABLE SUBQUERY:一个子查询,其结果不能被缓存,必须为外部查询的每一行重新计算.
UNCACHEABLE UNIONunion中存在不可缓存sql语句
rows×filtered显示将与下表联接的行数
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:全表扫描类型
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