执行计划: 根据type类型去判断执行速度

  • explain sql语句

explain select * from userinfo;


id -> 查询顺序的标识

select_type -> 查询类型:
SIMPLE
简单查询
PRIMARY
最外层查询
SUBQUERY
映射为子查询
DERIVED
子查询
UNION
联合
UNION RESULT
使用联合的结果
table -> 正在访问的表名

partitions -> 匹配的分区

type -> 查询时的访问方式:

  • 性能:ALL < INDEX < RANGE < INDEX_MERGE < REF_OR_NULL < REF < EQ_REF < SYSTEM/CONST -> (慢 < 快)
ALL
全表扫描,对于数据表从头到尾找一遍
select * from userinfo;

特别情况: 如果有limit限制,则找到数据之后就不在继续往下扫描(查找)
select * from userinfo limit 1;
INDEX
全索引表扫描,对索引表(创建索引时所创建的额外文件)从头到尾找一遍
username 为索引的前提下
select username from userinfo;
RANGE
对索引列进行范围查找 -> 在条件查询中出现 between and or > < >= <= 的操作
select * from userinfo where age in (1,30);
INDEX_MERGE
合并索引,使用多个单列索引进行条件查询
username 和 address 为索引的前提下
select * from userinfo where username='用户999999' or address='茂名';
REF
根据索引查找一个或多个值
username 为索引的前提下
select * from userinfo where username='用户999999';
REF_OR_NULL
与REF类型类似,只是增加了null值的比较。实际用的不多
EQ_REF
连表操作时使用了主键或唯一索引
nid 为主键或唯一索引的前提下
select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;
CONST
常量,条件查询中只有一个条件,且这个条件等于一个常量
select * from userinfo where id=2;
SYSTEM
表中只有一条数据
select * from userinfo where id=1;

possible_keys -> 显示可能应用在这张表中的索引

key -> 在这次查询中实际使用上的索引

key_len -> MySQL中使用索引字节长度

ref -> 如果是使用的常数等值进行条件查询,这里就会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

rows -> MySQL估计查询到的行数 -> 不准确只是估计值

filtered -> 使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

extra -> 该列包含MySQL解决查询的详细信息:

Using index
表示mysql将使用覆盖索引,以避免访问数据表。
不要把覆盖索引和index访问类型弄混了
Using where
表示mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示Using where。有时Using where的出现就是一个暗示:查询可受益于不同的索引。
Using temporary
表示mysql将查询到的数据存储到临时表中
Using filesort
排序时无法使用到索引时,就会出现这个。常见于 order by 和 group by 语句中
distinct
在select语句中使用了distinc关键字
using_union
表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集
Using intersect
表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集
Using sort_union
与 using_union 类似,只是它是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
Using sort_intersection
与 using intersect 类似,只是它是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
Range checked for each record(index map: N)
表示没有好用的索引,新的索引将在连接的每一行数据上重新估算,N是显示在主键列中索引的位图,并且是冗余的