MySQL中的执行计划(explain)

本文详细介绍了MySQL查询执行计划中的关键字段,包括ID、select_type、table、type等,解析了各种类型的意义和查询效率。通过对示例SQL的分析,展示了如何根据执行计划进行查询优化,例如const类型的高效查询和ALL类型的全表扫描。了解这些信息有助于提升数据库查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

explain关键字使用了以后,共有下述12个字段信息展示:

1.id

    ID列中的数据为一组数字,表示执行select语句的顺序,其取值为1、2、3...n。

    ID值相同时,执行顺序由上至下。

    ID值越大优先级越高,越先被执行。

2.select_type

    select_type的取值共有如下8个,最常见的是前面4个

simple:不包含子查询或是union操作的查询
primary:查询中如果包含任何子查询,那么最外层的查询则被标记为primary
subquery:select列表中的子查询
dependent subquery:依赖外部结果的子查询
union:union操作的第二个或是之后的查询的值为union
dependent union:当union作为子查询时,第二个或是第二个后的查询的select_type的值
union result:union产生的结果集
derived:出现在from子句中的子查询

3.table

    输出数据行所在的表的名称,一般为简单表的表名。如果给表定义了别名,则显示的是定义的别名。

    <unionM,N>由ID为M,N查询union产生的结果集。

    <derivedN>/<subqueryN>由ID为N的查询产生的结果。

-- <derivedN>/<subqueryN>由ID为N的查询产生的结果
EXPLAIN
SELECT
  title
FROM 
(SELECT one_category_id,MAX(product_id) AS pid FROM product_info GROUP BY one_category_id) a
JOIN product_comment b
ON a.pid = b.product_id;

    对于上述sql,其对应的执行计划如下:

    

    <derived2>对应的表是由ID为2的查询产生的结果集

4.partition

    对于分区表,显示查询的分区I D;对于非分区表,显示为NULL

5.type

    表示mysql在表中找到所需行的方式,又称“访问类型”,其取值共有如下9个,其性能也是从高到低

system:是const类型的特例,当查询的表只有一行的情况下使用system
const:表中有且只有一个匹配的行时使用,如对主键或是唯一索引的查询,这是效率最高的联接方式
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
ref:非唯一索引查找,返回匹配某个单独值的所有行
ref_or_null:类似于ref类型的查询,但是附加了对NULL值列的查询
index_merge:该联接类型表示使用了索引合并优化方法。
range:索引范围扫描,常见于between、>、<这样的查询条件
index:全索引扫描(FULL index Scan),同ALL的区别是,遍历的是索引树
ALL:全表扫描(FULL TABLE Scan),将遍历全表以找到匹配的行,这是效率最差的联接方式
CREATE TABLE `user` (
  `name` varchar(10) DEFAULT NULL,
  `age` varchar(2) DEFAULT NULL,
  `id` int(4) NOT NULL,
  PRIMARY KEY (`id`)
);
insert into `user` (`name`, `age`, `id`) values('张三','18','1');
insert into `user` (`name`, `age`, `id`) values('李四','19','2');
EXPLAIN
SELECT * FROM USER WHERE id =1;

  对于上述sql, 其对应的执行计划如下,type列的值为const

 

EXPLAIN
SELECT * FROM USER;

  对于上述sql, 其对应的执行计划如下,type列的值为ALL

    

 

6.Extra

    包含不适合在其它列中显式但十分重要的额外信息,其取值共有如下7个

Distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
Not exists:使用not exists来优化查询
Using filesort:使用额外操作来进行排序,通常会出现在order by或group by查询中
Using index:使用了覆盖索引进行查询
Using temporary:MySQL需要使用临时表来处理查询,常见于排序,子查询和分组查询
Using where:需要在MySQL服务器层使用WHERE过滤条件来过滤数据
select tables optimized away:直接通过索引来获取数据,不需要访问表

7.possible_keys

   指出MySQL能使用那些索引来优化查询;查询列所涉及到的列上的索引都会被列出,但不一定会被使用

8.key

   查询优化器优化查询实际所使用的索引,如果没有可用的索引,则显示为NULL。如查询使用了覆盖索引,则该索引仅出现在Key列中

9.key_len

   表示索引字段的最大可能长度,key_len的长度由字段定义计算而来,并非数据的实际长度

10.ref

   表示那些列或常量被用于查找索引列上的值

11.rows

   表示MySQL通过索引统计信息,估算的所需读取的行数。rows值的大小是个统计抽样结果,并不十分准确

12.filtered

​​​​​​​   表示返回结果的行数占需读取行数的百分比,filtered列的值越大越好,filtered列的值依赖说统计信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值