MySQL --- explain关键词
参看博客:
https://segmentfault.com/a/1190000008131735
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_ref_or_null
https://tech.meituan.com/2014/06/30/mysql-index.html
explain type字段
type的类型 | 说明(性能由上到下降低) | 例子 |
---|---|---|
system | 表中只有一条数据. 这个类型是特殊的 const 类型 | |
const | 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可. | SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2; |
eq_ref | 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高. | SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1; |
ref | 此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询 | SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1; |
fulltext | join操作使用了全文索引 | |
ref_or_null | SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL; | |
index_merge | ||
unique_subquery | ||
index_subquery | ||
range | 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中 | |
index | ||
ALL |
explain table字段
输出行引用的表的名称,或者是:
< unionM,N >:行指的是id值为M和的行 的 并集 N。
< derivedN >:该行是指用于与该行的派生表结果id的值 N。例如,派生表可能来自FROM子句中的子查询 。
< subqueryN >:行指的是id 值为的行的具体化子查询的结果N。
如 union查询:
EXPLAIN ( SELECT * FROM testArrange WHERE testArrangeID IN ( 31, 32, 33 ) )
UNION
( SELECT * FROM testArrange WHERE testArrangeID IN ( 43, 45, 47 ) );
explain partitions字段
查询将匹配记录的分区。
explain select_type字段
select_type | 说明 |
---|---|
SIMPLE | 表示此查询不包含 UNION 查询或子查询 |
PRIMARY | 表示此查询是最外层的查询 |
UNION | 表示此查询是 UNION 的第二或随后的查询 |
DEPENDENT UNION | UNION 中的第二个或后面的查询语句, 取决于外面的查询 |
UNION RESULT | UNION 的结果 |
SUBQUERY | 子查询中的第一个 SELECT |
DEPENDENT SUBQUERY | 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果 |
explain possible_keys
表示 MySQL 在查询时, 能够使用到的索引. 但即使有些索引在 possible_keys 中出现, 并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体使用了哪些索引, 由 key 字段决定。
key
此字段是 MySQL 在当前查询时所真正使用到的索引。
key_len
表示查询优化器使用了索引的字节数. 这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到。
key_len 的计算规则:
类型 | 计算规则 |
---|---|
char(n byte) | 3n byte |
varchar(n) | 3n+2 byte(utf8)、4n+2 byte(utf8mb4) |
TINYINT | 1 byte |
SMALLINT | 2 byte |
MEDIUMINT | 3 byte |
INT | 4 byte |
BIGINT | 8 byte |
DATE | 3 byte |
TIMESTAMP | 4 byte |
DATETIME | 8 byte |
字段可以为空 | 占1 byte |
rows
rows是核心指标。绝大部分rows小的语句执行一定很快(有例外,下面会讲到),所以优化语句基本上都是在优化rows。
extra
当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大.
如:
可以建立联合索引 index(‘student_id’,‘term’,‘courseClass_id’) 使extra不用using filesort,具体可参看上面的博客。