MySQL-explain执行计划

发布时间 2023-07-31 10:28:20作者: coolw

explain关键字可以模拟优化器执行SQL语句,分析查询语句的性能

在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,并不会执行这条SQL

explain执行计划

  • id:select语句标识符
id表示查询语句的序号,自动分配,顺序递增,值越大,执行优先级越高;id相同时,优先级由上而下

  • select_type:select语句查询类型
select_type表示查询类型,常见的有SIMPLE简单查询、PRIMARY主查询、SUBQUERY子查询、UNION联合查询、UNION RESULT联合临时表结果等

  • table:查询用到的表
table表示SQL语句查询的表名、表别名、临时表名

  • partitions:查询匹配到的分区
partitions表示SQL查询匹配到的分区,没有分区的话显示NULL

  • type:表连接类型或者数据访问类型
type表示表连接类型或者数据访问类型,就是表之间通过什么方式建立连接的,或者通过什么方式访问到数据的

具体有以下值,性能由好到差依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

system:当表中只有一行记录时,也就是系统表,时const类型的特列

const:表示使用主键索引或者唯一索引进行查询时,最多返回一条数据。性能较好,推荐使用

eq_ref:表示表连接使用到了主键或者唯一索引

ref:表示使用了非唯一索引进行查询

ref_or_null:表示使用了非唯一索引进行查询,并且包含了null值的行

index_merge:表示用到索引合并的优化逻辑,即用到的多个索引

range:表示使用到了索引范围查询

index:表示使用索引进行全表扫描

ALL:表示全表扫描,性能最差

  • possible_keys:可能用到的索引
表示可能用到的索引列,实际查询并不一定能用到

  • key:实际用到的索引
表示实际查询用到索引列

  • key_len:索引长度
表示索引所占的字节数

每种类型所占的字节数如下

类型 占用空间
char(n) n个字节
varchar(n) 2个字节存储变长字符串,如果时utf-8,则长度3n+2
tinyint 1个字节
smallint 2个字节
int 4个字节
bigint 8个字节
date 3个字节
timestamp 4个字节
datetime 8个字节
  • ref:查询条件中的列
表示where语句或者表连接中与索引比较的参数,常见的有const(常量)、func(函数)、字段名

如果没用到索引,则显示为NULL。

  • rows:预计扫描的行数
表示执行SQL语句所扫描的行数

  • filtered:过滤行所占百分比
表示按条件过滤的表行的百分比

  • Extra:附加信息
表示一些额外的扩展信息,不适合在其他列展示,却又十分重要

Using where:表示使用了where条件搜索,但没有使用索引

Using index:表示用到了覆盖索引,即在索引上就查到了所需数据,无需二次回表查询,性能较好

Using filesort:表示使用了外部排序,即排序字段没有用到索引

Using temporary:表示用到了临时表,下面的示例中就是用到临时表来存储查询结果

Using join buffer:表示在进行表关联的时候,没有用到索引,使用了连接缓存区存储临时结果

下面的示例中cert_no在两张表中都没有建索引

Using index condition:表示用到索引下推的优化特性