MySQL执行计划Explain详解
1. Explain概述
使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句, 从而知道 MySQL 是如何处理你的 SQL 语句的。 分析你的查询语句或是表结构的性能瓶颈。
EXPLAIN 关键字总共12个字段:id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,Extra。
Explain 执行后返回的信息
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
执行id | 查询类型 | 操作表 | 分区 | 类型 | 可能用到索引 | 实际用到索引 | 索引使用程度 | 使用索引列 | 操作行数 | server层过滤后数量百分比 | 额外说明 |
2. Explain使用
Explain用法: Explain+SQL 语句。
Explain select * from business_category where id = 8;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | business_category | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.00 |
3. Explain参数说明
3.1 id
select 查询的序列号,包含一组数字, 表示查询中执行 select 子句或操作表的顺序。
①id 相同, 执行顺序由上至下
②id 不同, id 不同, 如果是子查询, id 的序号会递增, id 值越大优先级越高, 越先被执行。
③有相同也有不同。
id 如果相同, 可以认为是一组, 从上往下顺序执行; 在所有组中, id 值越大, 优先级越高, 越先执行衍生 = DERIVED
3.2 select_type
select_type 代表查询的类型, 主要是用于区别普通查询、 联合查询、 子查询等的复杂查询。
3.3. table
操作的那张表。
3.4. partitions
partitions 显示查询将访问的分区,如果你的查询是基于分区表。
3.5. type
type 是查询的访问类型。 是较为重要的一个指标, 结果值从最好到最坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说, 得保证查询至少达到 range 级别, 最好能达到 ref。
3.6. possible_keys
显示可能应用在这张表中的索引, 一个或多个。 查询涉及到的字段上若存在索引, 则该索引将被列出, 但不一定被查询实际使用。
3.7. key
实际使用的索引。 如果为NULL, 则没有使用索引。
3.8. key_len
表示索引中使用的字节数, 可通过该列计算查询中使用的索引的长度。 key_len 字段能够帮你检查是否充分的利用上了索引。 ken_len 越长, 说明索引使用的越充分
就是key的使用程度,数值越大使用越充分。这个是可计算的,根据字符类型char或者varchar,字符长度varchar(20),编码格式utf-8存储3个字节,gbk是2个字节等,具体就不细说了。
3.9. ref
显示索引的哪一列被使用了, 如果可能的话, 是一个常数。 哪些列或常量被用于查找索引列上的值。
3.10 rows
rows 列显示 MySQL 认为它执行查询时必须检查的行数。 越少越好!
3.11 filtered
使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。
3.12 Extra
其他的额外重要的信息。