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) UNION UNION语句中的第二个或后面的查询。 4) DEPENDENT UNION UNION语句中的第二个或后面的查询。取决于外层的查询。 5) UNION RESULT UNION的结果集。 6) SUBQUERY 子查询中的第一个SELECT。 7) DEPENDENT SUBQUERY 子查询中的第一个SELECT。取决于外层的查询。 8) DERIVED FROM子句中出现的子查询。也叫派生表。 |
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是如何解析查询语句的其它信息。 |