mysql的性能优化神器explain

  • id
  • select_type
  • table
  • partitions
  • type
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • Extra

解释意思:

1. id

SELECT查询的标识符, 每个SELECT语句都会自动分配一个唯一的标识符

2. select_type

每个select查询字句的类型,具体类型以及对应作用如下表:


类型名
解释
SIMPLE
简单SELECT,不使用UNION或子查询等

PRIMARY 查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

UNION UNION中的第二个或后面的SELECT语句

DEPENDENT UNION UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT UNION的结果

SUBQUERY 子查询中的第一个SELECT

DEPENDENT SUBQUERY 子查询中的第一个SELECT,取决于外面的查询

DERIVED 派生表的SELECT, FROM子句的子查询

UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行

3. table

显示这一行的数据是查哪张表的,不过有时短路显示的不是真实的表名。

4. partitions

匹配的分区(这个目前用处不大)

5. type

访问类型,表示MySQL在表中找到所需行的方式,对应的值和解释如下:

类型名 优级别 解释

system 1 表仅有一行

const 2 表最多有一个匹配行,在查询开始时即被读取

eq_ref 3 使用primary key或者unique key作为多表连接的条件,仅从该表中读取一行

ref 4 作为查询条件的索引在每个表匹配索引值的行从表中读取出来

fulltext 5 全文索引检索

ref_or_null 6 和ref一致,但增加了NULL值查询支持

index_merge 7 表示使用了索引合并优化方法

unique_subquery 8 使用了替换了in子查询

index_subquery 9 使用了替换了in子查询,但只适用于子查询中的非唯一索引

range 10 只检索给定范围的行,使用一个索引来选择行

index 11 全表扫描,但扫描表的方式是按索引的次序进行

ALL 12 全表扫描的方式找到匹配的行


type作为访问类型,其值代表着当前查询所用的类型,是体现性能的一个重要指标,从表中可以看到,从上到下,扫描表的方式越来越宽,性能也就越来越差,因此,对于一个查询,最好能保持在range级别以上。

6. possible_keys

主动指出查询能用哪个索引在表中找到记录

也就是会列出在查询中的字段中有索引的字段,但不一定被查询所用。

7. key

显示再查询中实际使用的索引/键,如果没有索引,则显示NULL。

但如果想强制查询中使用或忽视possible_keys列中的索引,则可以在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

8. key_len

表示索引中使用的字节数。

9. ref

表示哪些列或常量被用于查找索引列上的值。

10. rows

显示当前查询估算到的查找到匹配记录所需的记录行数。

11. Extra

显示当前查询所用的解决方式,它有以下几种情况:

类型名 解释

Using where 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,

Using temporary 表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

Using filesort MySQL中无法利用索引完成的排序操作称为“文件排序”

Using join buffer 改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where 这个值强调了where语句会导致没有符合条件的行。

Select tables optimized away 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行