MySQL 执行计划使用详解,2024年最新华为外包Java面试题

image.png

select_type


包括范围: simple. primary,subquery, derived, union, union result 查询类型主要是用于区别普通查询,联合查询,子查询等复杂的查询

  • simple,简单的select 语句,查询中不包含自查询或者 union

  • primary, 查询若包含任何复杂的子部分,最外层查询则被标记为primary

  • subquery, 在 select 或 where 列表中包含子查询

  • derived,在 from 列表中包含自查询被标记为 derived (衍生)MySQL 会递归执行这些自查询,把结果放在临时表中。

  • union,若第二个 select 出现在 union 之后,则被标记为 union. 若 union 包含在 from 子句子查询中,外层 select 将别标记为 derived

  • union result, 从 union 表中获取结果的 select

table


  • 这行数据是关于那种表的

type


类型: all , index , range, ref, eq_ref, const, system ,null type 显示的是防卫类型,是较为重要的一个指标,结果从好到坏依次是: system > count > eq_ref > range > index > all

​sytem > const > eq_ref > ref > fulltext > ref_or_null > index_merge >> unique_subquery > index_subquery > range > index > ALL

system

表只有一行记录(等于系统表),这是 const 类型的特列, 平时不会出现,这个也可以忽略不计

count

explain select * from (select * from t1 where id =1) d1;

表示通过索引一次就找到了, const 用于比较 primary key 或者 unique 索引。 因为只匹配一行数据,所以很快如将主键置于where 列表中, MySQL 就能将该查询转换为一个常量。

image.png

eq_ref

explain select * from t1, t2 where t1.id = t2.id

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描. 查询案例:

image.png

ref

tb_emp ddl

CREATE TABLE tb_emp (

id int(11) NOT NULL AUTO_INCREMENT,

name varchar(30) DEFAULT NULL,

dept_id int(11) DEFAULT NULL,

PRIMARY KEY (id),

) ;

#员工表添加年龄列

alter table tb_emp add column age int(11) default null after name;

#添加复合索引

create index idx_emp_name_age on tb_emp(name, age);

explain select * from tb_emp where name = ‘z3’;

非唯一性索引扫描, 返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独的行,然而,它可能会找到多个符合个条件的行,所以它应该属于查找和扫描的混合体

image.png

range

explain select * from t1 where id between 1 and 3;

explain select * from t1 where id in (1, 2, 3);

只检索给定范围内的行,使用一个索引来选择行。key 列显示使用了哪个索引 一般就是你在 where 语句中出现了 between、<、>、in 等的查询 这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某个点,而结束于另一个点,不用全表扫描 案例结果:

image.png

index

explain select id from t1;

Full Index Scan , index 于 ALL的却别 ,index 类型只遍历索引树, 这通常比 ALL 快, 因为索引文件通常比数据文件小。(也就是说虽然 all 和 index 都是读全表,但是index 是从索引中读取的, 而 all 是从硬盘中读取的 ) 查询结果:

image.png

all

explain select * from t1;

Full Table Scan 将遍历全表找到匹配的行

image.png

备注:一般来说,得以保证查询至少达到 rang 级别, 最好能达到 ref。

possible_keys


显示可能应用在这张表中的索引,一个或多个。 查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用.

key


实际使用的索引,如果为NULL,则没有使用索引 查询中若使用了覆盖索引,则该索引仅出现在KEY列表中

explain select col1, col2 from t1;

create index idx_col1_col2 on t1(col1, col2);

explain select col1, col2 from t1;

案例一(加索引之前)

image.png

案例二(加索引之后)

image.png

key_len


desc t1;

explain select * from t1 where col1 = ‘ab’;

explain select * from t1 where col1 = ‘ab’ and col2 = ‘bc’;

表示索引中使用的字节数,可通过该列计算查询中的使用的索引的长度,在不损失精确性的情况下,长度越短越好 key_len 显示的只为索引字段的最大可能长度,** 并非实际使用长度**。即 key_len e是更具表定义计算而得,不是通过表内检索出的。 查询结果:

image.png

总结:条件越多,付出的代价越大,key_len 的长度也就越大,建议在一定条件的情况下,key_len 越短,效率越高。

Rows


根据表统计信息及索引选用情况, 大致估算出找到所需的记录所需读取的行数

image.png

filtered


Extra


包含不适合其他列中显示但十分重要的额外信息 id, select_type, table, type , possible_keys, key, key_len, ref, rows, Extra

1. Using filesort

文件排序

2. Using temporary

explain select col2 from t1 where col1 in (‘ab’, ‘ac’, ‘as’) group by col2 \G;

explain select col2 from t1 where col1 in (‘ab’, ‘ac’, ‘as’)

group by col1, col2, col3 \G;

使用了临时表保存中间结果, MySQL 在对查询结果排序时使用临时表。 常见于排序 order by 和分组查询 group by 。 例子:

image.png

3. Using index

explain select col2 from t1 where col1=100;

explain select col1, col2 from t1;

表示相应的 select 操作使用了覆盖索引 (Covering Index), 避免了访问表的数据行,效率不错~ 如果同时出现 using where , 表示索引被用来执行索引键值的查找; 如果没有同时出现 using where , 表明索引引用来读取数据而非执行查找动作。 例子:

image.png

覆盖索引 (Covering Index)

  • 覆盖索引 (Covering Index), 一说为索引覆盖

  • 理解方式一:就是 select 的数据列只用从索引中就能取得,不必读取数据行, MySQL 可以利用你索引返回 select 列表的字段, 而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖

  • 理解方式二:索引是高效找到的行的一个方法, 但是一般数据库也能使用索引找到一个列的数据, 因此它不必读取整个行,毕竟索引叶子节点存储了他们索引的数据;当能通过读取索引就可以得到想要的数据, 那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。

  • 注意: 1. 如果要使用覆盖索引,一定要注意 select 列表汇总只取出需要的列,不可 select * ; 2. 因为如果将所有字段一起做索引将会导致索引文件过大,查询性能下降。

4. Using Where

表明使用了 where 过滤

5. using join buffer

使用了链接缓存

6. impossible where

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

复习的面试资料

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

  • 第一部分:Java基础-中级-高级

image

  • 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能调优(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)

image

  • 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并发编程+设计模式+数据结构与算法+网络

image

进阶学习笔记pdf

  • Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法

image

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

image

image

image

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))**

[外链图片转存中…(img-CpqwvL3E-1712801372495)]

[外链图片转存中…(img-Yj1uOkem-1712801372495)]

[外链图片转存中…(img-dPGSoxyz-1712801372496)]

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

[外链图片转存中…(img-xoMJF9xZ-1712801372496)]

[外链图片转存中…(img-7ti9QfWd-1712801372496)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-0Zr5i9F7-1712801372496)]

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值