MySQL EXPLAIN 获取 SQL 的执行计划
EXPLAIN FIELDS
EXPLAIN 命令的输出内容大致如下:
|
|
id
- ID 列中的如果数据为一组数字,表示执行 SELECT 语句的顺序;如果为 NULL,则说明这一行数据是由另外两个 SQL 语句进行 UNION 操作后产生的结果集。
- ID 值相同时,说明 SQL 执行顺序是按照显示的从上至下执行的。
- ID 值不同时,ID 值越大代表优先级越高,则越先被执行。
select_type
值 | 含义 |
---|---|
SIMPLE | 不包含子查询或是UNION操作的查询 |
PRIMARY | 查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY |
SUBQUERY | SELECT 列表中的子查询 |
DEPENDENT | SUBQUERY 依赖外部结果的子查询 |
UNION | Union操作的第二个或是之后的查询的值为union |
DEPENDENT UNION | 当UNION作为子查询时,第二或是第二个后的查询的select_type值 |
UNION RESULT | UNION产生的结果集 |
DERIVED | 出现在FROM子句中的子查询 |
table
- 输出去数据行所在表的名称,如果表取了别名,则显示的是别名。
<union M,N>
: 由ID为M,N查询union产生的结果集<derived N>/<subquery N>
:由ID为N的查询产生的结果
partitions
查询匹配的记录来自哪一个分区。对于分区表,显示查询的分区 ID,对于非分区表,显示为 NULL
type
按性能从高至低排列如下:
值 | 含义 |
---|---|
system | 这是 const 联接类型的一个特例,当查询的表只有一行时使用 |
const | 表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式 |
eq_ref | 唯一索引或主键索引查询,对应每个索引键,表中只有一条记录与之匹配 |
ref | 非唯一索引查找,返回匹配某个单独值的所有行 |
ref_or_null | 类似于 ref 类型的查询,但是附加了对 NULL 值列的查询 |
index_merge | 该联接类型表示使用了索引合并优化方法 |
range | 索引范围扫描,常见于 between 、> 、< 这样的查询条件 |
index | 全索引扫描,同ALL的区别是,遍历的是索引树 |
ALL | 全表扫描,这是效率最差的联接方式 |
possible_keys
指出MySQL能使用哪些索引来优化查询。查询列所涉及到的列上的索引都会被列出,但不一定会被使用。
key
查询优化器优化查询实际所使用的索引。如果表中没有可用的索引,则显示为 NULL
;如果查询使用了覆盖索引,则该索引仅出现在 key 列中。
key_len
表示索引字段的最大可能长度。key_len 的长度由字段定义计算而来,并非数据的实际长度。
ref
表示当前表在利用 key 列记录中的索引进行查询时所用到的列或常量。
rows
表示 MySQL 通过索引的统计信息,估算出来的所需读取的行数。rows 值的大小是个统计抽样结果,并不十分准确。
filtered
表示返回结果的行数占需读取行数的百分比。filtered 列的值依赖统计信息,所以同样也不是十分准确,只是一个参考值。 filtered 列的值越大越好,值越大,表明实际读取的行数与所需要返回的行数越接近。
Extra
包含MySQL如何执行查询的附加信息:
值 | 含义 |
---|---|
Distinct | 优化 DISTINCT 操作,在找到第一个匹配的元素后即停止查找 |
Not exists | 使用 NOT EXISTS 来优化查询 |
Using filesort | 使用额外操作进行排序,通常会出现在 ORDER BY 或 GROUP BY 查询中 |
Using index | 使用了覆盖索引进行查询 |
Using temporary | MySQL 需要使用临时表来处理查询,常见于排序,子查询,和分组查询 |
Using where | 需要在 MySQL 服务器层使用WHERE条件来过滤数据 |
Select tables optimized away | 直接通过索引来获得数据,不用访问表,这种情况通常效率是最高的 |