用法
使用方法: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后查看执行计划