目录
Explain概念
在 MySQL 中,EXPLAIN
关键字用于分析查询语句的执行计划,帮助用户理解查询的执行过程,优化查询性能。
使用方式如下:explain + sql
EXPLAIN select * FROM tb_user_info where id =1;
显示结果
执行计划各字段含义
EXPLAIN select id FROM tb_user_info where id =1 union all select id from tb_product_info;
1. id
- 如果 id 序号相同,从上往下执行
- 如果 id 序号不同,序号大先执行
- 如果两种都存在,先执行序号大,在同级从上往下执行
- 如果显示 NULL,最后执行,表示结果集,并且不需要使用它来进行查询
2.select_type
SIMPLE:简单的 select 查询
PRIMARY:复杂查询中最外层查询,比如使用 union 或 union all 时,id 为 1 的记录 select_type 通常是 primary,如上图所示
SUBQUERY:指在 select 语句中出现的子查询语句,结果不依赖于外部查询(不在 from 语句中),如下图所示
EXPLAIN select id,(select name from tb_product_info where id =1) FROM tb_user_info
UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM 子句的子查询中,那么第一个 SELECT 将被标记为 DERIVED
3.table
表名或派生表的别名。
4.type
表示查询使用的类型,性能由好到坏依次是:system > const > eq_ref > ref > range > index > all
,一般来说能达到 range 级别,最好能达到 ref 级别。
system:表只有一行(相当于系统表),是 const 类型的特例
create table sys(i int) engine = memory;
insert into sys values(2);
explain select * from sys;
const:针对主键或唯一索引的等值查询扫描,只返回一行数据
EXPLAIN select * from tb_user_info where id=1;
eq_ref:基于主键或唯一索引连接两个表,对于每个索引键值,只有一条匹配记录,被驱动表的类型为 eq_ref,这种类型只出现在 join
ref:非唯一性索引扫描,返回匹配多个符合条件的行
EXPLAIN select * from tb_user_info where user_name='李四';
range:范围扫描,检索指定范围的行,一般出现在 where 语句出现 between、< 、>、in 等的查询
EXPLAIN select * from tb_user_info where id>1;
index:只遍历索引树即可找到匹配的数据,比如下例中 user_id 就是 orders 表的索引
all:遍历全表找到匹配的数据
5. possible_keys
显示可能使用到的索引,实际不一定被使用
6. key
实际使用的索引
7. key_len
索引使用的字节数,可通过该列计算查询中使用的索引的长度,主要用于联合索引
8.ref
哪个列或常量与 key 一起用于查询。
9.rows
估计的扫描行数。
10.filtered
估计的返回行百分比。
11.Extra
扩展信息和额外操作。常见值包括:
Using index
:表示查询覆盖索引。Using where
:表示使用了 WHERE 子句来过滤结果。Using temporary
:使用了临时表。Using filesort
:使用了文件排序。