MySQL Explain 分析 SQL 的执行计划
explain提供了MySQL是如何执行语句的详细信息,开发人员可以根据这些信息对执行的语句进行性能方面的优化。explain可以与SELECT、INSERT、UPDATE、DELETE语句一起使用。
1. MySQL 版本
| 
 | 
 | 
2. explain 格式
| 
 | 
 | 
| 字段 | 描述 | 
|---|---|
| id | 查询语句标识符。数值越大优先级别越高,就越先执行。如果数值一样,则由上至下依次执行。NULL值表示这是一个结果集,不需要参与查询。 | 
| select_type | 查询类型。常见的有: 1) SIMPLE简单的SELECT查询。没有UNION或子查询。 2) PRIMARY最外层的SELECT语句。 3) UNIONUNION语句中的第二个或后面的查询。 4) DEPENDENT UNIONUNION语句中的第二个或后面的查询。取决于外层的查询。 5) UNION RESULTUNION的结果集。 6) SUBQUERY子查询中的第一个SELECT。 7) DEPENDENT SUBQUERY子查询中的第一个SELECT。取决于外层的查询。 8) DERIVEDFROM子句中出现的子查询。也叫派生表。 | 
| table | 查询的表名。 1) 如果查询使用了别名,则显示该别名; 2) 如果不涉及对数据表的操作,则显示NULL; 3) <unionM,N>表示引用id为M和N的执行计划UNION的结果;4) <derivedN>表示引用id为N的执行计划中派生的表(临时表);5) <subqueryN>表示引用id为N的子查询的结果; | 
| partitions | 使用的表分区。如果没有分区,则显示NULL。 | 
| type | 关联类型。MySQL会认为任何查询都是关联查询,其性能从最好到最差依次为: 1) system表中仅有一行数据。它是 const的一个特列。2) const表中最多只有一个与之匹配的行。常见于使用唯一索引和常量值进行比较时。 3) eq_ref当多表链接使用非空唯一索引作为关联条件的时候。 4) ref当使用唯一索引的最左前缀或非唯一索引时。 5) fulltext使用全文索引进行关联。 6) ref_or_null和ref相似,另外MySQL还会检索值为NULL的行。 7) index_merge使用了索引合并优化。 8) unique_subquery发生在IN子查询中,且子查询使用唯一索引。其形式为: value IN (SELECT primary_key FROM single_table WHERE some_expr) 9) index_subquery与unique_subquery关联类型相似,其子查询使用的是非唯一索引,其形式为: value IN (SELECT key_column FROM single_table WHERE some_expr) 10) rang只检索给定范围的行。常见于: =,<>,>,>=,<,<=,BETWEEN,IN 11) index该关联类型与ALL相同,它扫描整个索引树,但通常比ALL要快。 12) ALL全表扫描,这是最慢的一种关联类型。 | 
| possible_keys | 查询中可能用到的索引。这些索引实际中可能并没有用到。如果值是NULL,则表明查询没有用到索引,此时可以检查WHERE子句中哪些列适合加索引以提高查询的性能。 | 
| key | 查询中实际用到的索引。如果值是NULL,则表明MySQL找不到更有效的索引来执行查询。 | 
| key_len | 使用到的索引的长度。 | 
| ref | 使用哪些列或常量可以与索引列一起从表中选择行。 | 
| rows | MySQL认为执行此查询需要检查的行数。对于InnoDB表来说,这是一个估算值,并不准确。该值越小越好。 | 
| filtered | 通过条件过滤出的行数的百分比估计值。 | 
| Extra | 显示MySQL是如何解析查询语句的其它信息。 |