【MySQL系列3】MySQL执行计划EXPLAIN详细说明和举例,史上最全,先收藏了,用的时候就再也不用到处查资料

系统表里面只有一行记录,这个是const类型中的特殊情况。

EXPLAIN SELECT * FROM mysql.time_zone – 这条记录是我自己写进去测试的

在这里插入图片描述

const 类型

表最多有一个匹配行,在查询开始时读取。因为只有一行,所以这一行中列的值可以被优化器的其他部分视为常量。const表非常快,因为它们只被读取一次。

const用于将主键或唯一索引的所有部分与常量值进行比较。const适用于如下查询:

SELECT * FROM tbl_name WHERE primary_key=1;

SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;

举例1:

EXPLAIN SELECT * FROM USER WHERE id=1;

在这里插入图片描述

举例2::

ALTER TABLE USER DROP PRIMARY KEY; – 删除原先主键索引

ALTER TABLE USER ADD PRIMARY KEY (id,NAME);-- 新建联合主键索引

EXPLAIN SELECT * FROM USER WHERE id=1 AND NAME=‘张一’;

在这里插入图片描述

eq_ref

对于前一个表中的每个组合,从这个表中读取一行。除了system和const类型之外,这是最好的连接类型。当使用索引的所有部分并且索引是主键或唯一非空索引时,将使用该类型。

eq_ref可以用于使用=操作符进行比较的索引列。比较值可以是常量,也可以是使用在该表之前读取的表中的列的表达式。

简单的说:就是两张表通过其中一张表的主键或者唯一非空索引进行关联时,查询结果是一对一的关系。

eq_ref适用于如下查询:

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column_part1=other_table.column

AND ref_table.key_column_part2=1;

举例1:

EXPLAIN SELECT * FROM USER u,user_detail d WHERE u.detail_id=d.id

在这里插入图片描述

举例2:

ALTER TABLE user_job DROP PRIMARY KEY;-- 删除主键单列索引

ALTER TABLE user_job ADD PRIMARY KEY id_name_index(id,job_name);-- 添加联合主键索引

EXPLAIN SELECT * FROM user u,user_job j WHERE u.job_id=j.id AND job_name=‘CEO’;

在这里插入图片描述

ref

对于前一个表中的每个行组合,从这个表中读取具有匹配索引值的所有行。如果连接只使用键的最左端前缀,或者如果键不是主键或惟一索引(换句话说,如果连接不能根据键值选择单个行),则使用ref。如果使用的键只匹配几行,这是一种很好的连接类型。

这个和eq_ref最大的区别是ref一般用于普通索引的场景下,而eq_ref是用于主键或者唯一非空索引

ref适用于如下三种类型查询:

SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table

WHERE ref_table.key_column_part1=other_table.column

AND ref_table.key_column_part2=1;

举例1:

ALTER TABLE user_detail DROP PRIMARY KEY;-- 删除主键索引

ALTER TABLE user_detail ADD INDEX id_index(id);-- 添加一个普通索引

EXPLAIN SELECT * FROM user_detail WHERE id=1

在这里插入图片描述

举例2:

EXPLAIN SELECT * FROM USER u,user_detail d WHERE u.detail_id=d.id;

在这里插入图片描述

举例3:

ALTER TABLE user_job DROP PRIMARY KEY;-- 删除联合主键索引

ALTER TABLE user_job ADD INDEX id_name_index(id,job_name);-- 添加普通的联合主键索引

EXPLAIN SELECT * FROM user u,user_job j WHERE u.job_id=j.id AND job_name=‘CEO’;

在这里插入图片描述

fulltext

这个比较简单,用到了全文索引就会出现,就不做演示了,感兴趣的可以点击这里,了解全文索引

ref_or_null

这个连接类型类似于ref,但是多了一个对空值的搜索条件。这种连接类型优化最常用于解析子查询。适用于如下查询:

SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

举例:

ALTER TABLE user_detail MODIFY COLUMN id INT(3) DEFAULT NULL;

EXPLAIN SELECT * FROM user_detail WHERE id=‘111’ OR id IS NULL;

注意,这个例子中因为id是整型,本人这边因为反复修改索引,导致id列已经有了默认值为0,所以MySQL知道这一列没有null值,直接查询是不会出现这种类型的,故而才需要改为默认值为null

在这里插入图片描述

index_merge

索引合并访问方法检索具有多个范围扫描的行,并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描,不能跨多个表扫描。合并可以生成其底层扫描的联合、交叉或交叉的联合。

想要详细了解索引合并的概念,请点击这里

下面几种情况可能会用到索引合并:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name

WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2

WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE ‘value%’)

AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2

WHERE t1.key1 = 1

AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

举例1(注意test表有一个主键索引和一个普通索引):

EXPLAIN SELECT * FROM test WHERE id = 1 OR NAME=‘张三丰’

在这里插入图片描述

这里之所以会单独准备一张test表是因为其他表数据都太少了,数据少的时候全表扫描有时候会比使用其他优化措施效率更高

举例2

EXPLAIN SELECT * FROM test WHERE (id = 1 OR NAME=‘张三丰’) AND company=‘huawei’;

在这里插入图片描述

unique_subquery

这个类型替换了表单的子查询中的一些eq_ref,一般用于子查询,而且子查询只返回主键或者唯一索引:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

unique_subquery只是一个索引查找函数,它完全取代了子查询以提高效率。

举例(test表和user表中id均为主键):

EXPLAIN SELECT * FROM user u WHERE id IN (SELECT id FROM test t) OR name=‘张一’

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

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

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

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

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

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

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-7cffEnTp-1712274300590)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值