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:表示用到索引下推的优化特性