Explain执行计划解析

用法

使用方法:explain select ……

结果默认会出现一个表格,具体字段如下:

id select type table partitions type possible_keys key_len ref rows filtered Extra

id:包含一组数字,表示查询中执行select自居或操作表的顺序。当id值一样的时候,执行顺序由上往下,

select type:表示查询中每个select子句的类型。

SIMPLE:查询中不包含子查询或者UNION

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

SUBQUERY:在select或where列表中包含了子查询,改子查询被标记未SUBQUERY

DERIVED:在from列表包含的子查询被标记未为ERIVED(衍生),若第二个select出现UNION之后,则被标记为UNION。如果UNION包含在from子句中的子查询中,外层select将被标记为DERIVED,从UNION表中获取结果的select被标记为:UNION RESULT

type:表示MySQL在表中找到所需行的方式,又称为访问类型。

ALL:Full Table Scan,全表扫描。性能最差

index:Full Index Scan,遍历索引树,性能最好

range:range inex scan,对索引的扫描开始于某一点,返回匹配的行,常用于between,<,>等范围查询

ref:非唯一索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引或唯一索引的非唯一前缀的查找

eq_ref:唯一性索引扫描,主键或唯一索引扫描

const、system:当MySQL对查询某部分及逆行优化,并转换为一个常量时,使用者类型访问。例如在where子句使用主键作为查询条件

NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或者索引

possible_keys:指出MySQL能使用哪个索引在表中查到数据,查询设计到的字段上若存在索引,则该索引将被列出来,但不一定被查询使用

key:显示MySQL在查询中实际使用的索引。若没有使用到索引,显示为Null。当查询中使用了覆盖索引,则索引进出现在key列中。

key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度

ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows:表述MySQL根据表统计信息以及索引选用那情况,估算找到所需记录需要读取的行数

Extra:包含不适用在其他列中显示但十分重要的额外信息

Using Where:表示在存储引擎搜到记录后及逆行“后过滤”,如果查询中未使用索引,Using Where的作用只是提醒我们将用Where子句来过滤结果集

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

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

MySQL执行计划的局限

1、不会高数你触发器、储存过程的信息或用户自定义函数对查询的影响情况

2、不考虑各种Cache

3、不能显示MySQL在查询时所作的优化工作

4、部分统计信息时估算的,并非精确的值

5、只能解析select操作,其他操作要重写为select后查看执行计划

Licensed under CC BY-NC-SA 4.0