面试官:MySQL explain你会关注哪些字段

89 阅读5分钟

编号

字段名称

字段说明

重要性

1

id

SELECT查询序号,即为sql语句执行的顺序。数字越大越优先执行

1、2、3...

★★

2

select_type

select类型,用于区分是普通查询、子查询或联合查询

simple:简单的查询,不含子查询和联合查询primary:子查询的最外层查询为primaryunion:在 union、union all 和子查询中的第二个和随后的 select为 uniondependent union:各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询就是 dependent unionunion result:从union表获取结果的 select为 union resultsebquery:在select或者where列表中包含子查询(不在from子句中)dependent sebquery:在 select 或者 where 列表中包含子查询derived:在 form 列表中包含的子查询被标记为 derived,也叫做派生类uncacheable sebquery:一个子查询的结果不能被缓存uncacheable union:表示 union 的查询结果不能被缓存

★★

3

table

表名或者别名,可能是临时表或者 union 合并结果集

table_name

4

type

访问类型,表示以何种方式去访问数据库

system:系统表const:最多只能匹配到一条数据eq_ref:当进行等值联表查询使用主键索引或者唯一性非空索引进行数据查找ref:查询使用的字段是个非唯一性索引索ref_or_null:字段既需要关联条件,也需要 null 值index_merge:在查询过程中需要多个索引组合使用unique_subquery:利用唯一索引来关联子查询,不再扫描全表index_subquery:利用索引来关联子查询,不再扫描全表range:利用索引查询的时候限制了范围,在指定范围内进行查询index:全索引扫描all:全表扫描system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

★★★★★

5

possible_keys

显示查询可能使用哪些索引来查找

索引名称

★★

6

key

实际使用的索引

索引名称

★★★

7

key_len

索引中使用的字节数

数值

★★★

8

ref

ref列显示使用哪个列或常数与key一起从表中查询

列名或const

★★★

9

rows

显示MYSQL执行查询的行数,数值越大越不好

数值

★★★★★

10

filtered

百分比值, 表示存储引擎返回的数据经过滤后, 剩下多少满足查询条件记录数量的比例

百分比

★★★★

11

extra

MySQL解决查询的详细信息

using filtersort:说明 mysql 无法利用索引进行排序,只能利用排序算法进行排序using index:表示当前的查询是覆盖索引的,直接从索引中读取数据using where:使用 where 进行条件过滤using temporary :建立临时表来保存中间结果,查询完成之后把临时表删除using join buffer:使用连接缓存impossible where:where 语句的结果总是 false

★★★★

1. id

id就是select查询序号,标志sql语句执行的顺序,数字大的先执行。

2.select_type

SELECT类型,它有以下几种值

2.1 SIMPLE

它表示简单的select,没有联合查询和子查询

2.2 PRIMARY

在有子查询的语句中,最外层的select查询就是primary

2.3 union

在 union、union all 和子查询中的第二个和后面的 select 会被标记为 union

2.4 dependent union

在包含 union 或者 union all 的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的 select_type 的值就是 dependent union

2.5 union result

从 union 表获取结果的 select 会被标记为 union result

2.6 sebquery

在 select 或者 where 列表中包含子查询(不在from子句中)

2.7 dependent sebquery

子查询中的第一个 select(不在 from 子句中),并且取决于外层查询

2.8 derived

在 form 列表中包含的子查询被标记为 derived,也叫做派生类

2.9 uncacheable sebquery

一个子查询的结果不能被缓存

2.10 uncacheable union

表示 union 的查询结果不能被缓存

3 Table

explain 语句访问的表名或者别名

4 type

访问类型,表示以何种方式去访问数据库

4.1 system

表仅有一行,这是const类型的特列

4.2 const

表最多有一个匹配行,const用于比较primary key 或者unique索引。

4.3 eq_ref

当进行等值联表查询使用主键索引或者唯一性非空索引进行数据查找

4.4 ref

查询使用的字段是个非唯一性索引索

4.5 ref_or_null

字段既需要关联条件,也需要 null 值

4.6 index_merge

在查询过程中需要多个索引组合使用

4.7 unique_subquery

利用唯一索引来关联子查询,不再扫描全表

4.8 index_subquery

利用索引来关联子查询,不再扫描全表

4.9 range

利用索引查询的时候限制了范围,在指定范围内进行查询

4.10 index

全索引扫描

4.11 ALL

全表扫描

5 possible_keys

显示查询可能使用哪些索引来查找,可能应用在这张表中的索引,一个或多个,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

6 keys

实际使用的索引,如果为 null ,则表示没有使用索引

7 key_len

MYSQL使用的索引长度

8 ref

ref列显示使用哪个列或常数与key一起从表中查询

9 rows

显示MYSQL执行查询的行数,数值越大越不好

10 filtered

百分比值, 表示存储引擎返回的数据经过滤后, 剩下多少满足查询条件记录数量的比例.

11 Extra

该列包含MySQL解决查询的详细信息。

  • using filtersort:说明 mysql 无法利用索引进行排序,只能利用排序算法进行排序
  • using index:表示当前的查询是覆盖索引的,直接从索引中读取数据
  • using where:使用 where 进行条件过滤
  • using temporary :建立临时表来保存中间结果,查询完成之后把临时表删除
  • using join buffer:使用连接缓存
  • impossible where:where 语句的结果总是 false