MySQL执行计划 explain 及 一条select语句在MySQL中的奇幻之旅
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL执行计划 explain 及 一条select语句在MySQL中的奇幻之旅相关的知识,希望对你有一定的参考价值。
示例
explain select * from emp;
解释
列(Column) | 含义(Meaning) |
---|---|
id | The SELECT identifier(每个select子句的标识id) |
select_type | The SELECT type(select语句的类型) |
table | The table for the output row(当前表名) |
partitions | The matching partitions (显示查询将访问的分区,如果你的查询是基于分区表) |
type | The join type(当前表内访问方式) |
possible_keys | The possible indexes to choose(可能使用到的索引) |
key | The index actually chosen(经过优化器评估最终使用的索引) |
key_len | The length of the chosen key (使用到的索引长度) |
ref | The columns compared to the index(引用到的上一个表的列) |
rows | Estimate of rows to be examined (要得到最终记录索要扫描经过的记录数) |
filtered | Percentage of rows filtered by table condition(存储引擎返回的数据在server层过滤后,剩下满足查询的记录数量的比例) |
extra | Additional information (额外的信息说明) |
重要字段(我个人认为的)再释义:
id:这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1。如存在子查询或者联合查询这个编号会自增。
type:此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型。
以下排序从最优到最差:
system:表内只有一行数据
const:最多只会有一条记录匹配,常用于主键或者唯一索引为条件查询
eq_ref:当连接使用的索引为主键和唯一时会出现
ref:使用普通索引=或<=> 运算符进行比较将会出现
fulltext:使用全文索引
ref_or_null:跟ref类型类似,只是增加了null值的判断,实际用的不多。语句为where name = ‘kaka’ and name is null,name为普通索引。
index_merge:查询语句使用了俩个以上的索引,常见在使用and、or会出现,官方文档将此类型放在ref_or_null之后,但是在很多的情况下由于读取索引过多性能有可能还不如range
unique_subquery:用于where中的in查询,完全替换子查询,效率更高。语句为value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引
range:索引范围查询,常见于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中。
index:索引全表扫描,把索引从头到尾扫一遍
all:全表扫描,性能最差。
key:上面写着
rows:这是mysql估算的需要扫描的行数(不是精确值)。这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好。
extra:在大多数情况下会出现以下几种情况。
Using index:使用了覆盖索引,查询列都为索引字段
Using where:使用了where语句
Using temporary :查询结果进行排序的时候使用了一张临时表
Using filesort :对数据使用一个外部的索引排序
Using index condition:使用了索引下推
一条select语句在MySQL中的奇幻之旅
注:MySQL8.0起以取消图中第九步(查询缓存)原因:把查询语句作为key ,将结果作为value 进行缓存,一旦这个表有更新,之前所有的缓存都会被清除掉。
以上是关于MySQL执行计划 explain 及 一条select语句在MySQL中的奇幻之旅的主要内容,如果未能解决你的问题,请参考以下文章