00:00
好同学们,那么接下来话呢,咱们就进入这一章的一个重点的工具啊,叫做plan的使用,那前面的话呢,我们通过呢,叫做诶慢查询日志对吧?我们开启相关的这个查询日志,包括呢,我们去定义它的这个long que,诶找到了这个查询之后,我们就可以使用这个,或者的话呢,我们叫啊这两个呢,其实是完全一样的,只不过呢,就是单词用的不同啊,咱们习惯上呢,都用这个了,就啊那我们就可以呢,使用这个plan的工具呢,对我们得到的这个慢查询这个查询语句进行一个剖析,我们查看一下它具体的个执行计划是什么,那一说到这个执行计划的话呢,我们在前面呢,是不是讲这个逻辑架构的时候呢,提到过这个叫优化器对吧,那么优化器的话呢,不是真正意义上呢,去执行我们这个SQ语句了,那是我们优化器的下一个阶段叫做执行器来做的事儿,那么优化器的话呢,仅仅是不是对于我们写的这个,当然呢,有可能是一个查询,还有可能是个增删改,对吧,对于我们这个SQL语句的话呢,我们进行一个优化操作。啊,那有可能我们这个色会语句当中会涉及到有多个索引,那这时候我们就要选择一下,到底应该选择哪一个索引,最终的话呢,它会生成一个执行计划,这个执行计划呢,它是以这个执行的整个成本最低为一个衡量的标准,那得到这个执行计划以后的话呢,它下一步呢,就用这个执行器呢去执行了,那对于我们来讲的话呢,咱们可以通过这个explain的这样的一个操作来查看一下这个具体的执行计划是什么,在这里边呢,其实就蕴含了很多的信息。
01:26
就相当于呢,我们使用这个explain呢,可以看到的这样的一些情况,比如说呢,表的读取顺序啊,我们这个数据读取操作的一个操作类型啊,这个哪些索引可以被使用,那这呢叫possible case是吧?还有呢,真实的被使用的是哪一个索引呢?表之间的引用关系是什么样子呢?还有哪些额外的信息啊等等这个呢,在我们或者呢是这个describe使用的当中呢,都能够看得到,诶都能看到,那这里边我们要再强调一点呢,就是呃,我们这时候呢,查看的这个执行计划呀,是咱们这个优化器呢,他认为执行成本最低的一种方式,但是有可能不一定是我们真正DV,或者我们是实际开发人员呢,在执行的时候呢,我们呃,选择的可能跟他这个最终确定的这个不一定是一样的。
02:11
啊,这个大家要注意一下,毕竟呢,这是我们一种自动的一种机制,对吧?OK,那我们人的话呢,可以根据这个实际情况呢,我们做一些这个呃,这个具体问题的一个这个这个选择是吧?哎,这个大家要注意一下这两个点啊,就是他认为优秀呢,不一定是我们实际上认为是最优的啊OK。好,那么官网当中呢,关于这个PLA呢,还是有这个介绍的,这儿呢,我放了两个,一个呢是5.7MYS的版本,一个是8.0MYS的版本,大家呢,有兴趣的话呢,可以点开呢进行一个查看。啊这呢,我打开的就是5.7的,那点开这个的话呢,就是我们对应的一个8.0的对吧?啊那么一提到这个英文的话呢,好像说呢,大家学习新知识似乎呢,都是看那个官方文档一样,其实肯定不是这样子的,对吧?呃,那大家呢,一般学习这个呃一个具体的技术的时候呢,怎么看待这个官方文档呀。啊,大家呢,可以提提自己的一个建议啊,打到我们这个公屏上啊,我分析一下我的一个情况,那一般的话呢,学习任何一个新技术啊,官方文档重不重要呢?那毫无疑问呢,是最重要最权威的,但是呢,一般的话呢,都不会优先选择官方文档来看啊,那首当其冲的话呢,就是这里边这个英文是不便于我们直接呢去进行阅读的啊,那你比如说我们这时候学习这个算啊,我一般会怎么学呢?首先呢,会找一些相关的中文的一些资料啊,一些教材,一些这个帖子,对吧?诶当然呢,再结合实际的这个实操一定是需要实操的,去发现问题,去学习这样的技术,然后呢,当有时候呢,出现一些问题解决不了的时候呢,比如百度啊谷歌呀等等,没有相关的一些解决方案的时候,那怎么办呢?这时候来看一下这官网,甚至说呢,有的时候呢,一些描述和我们实际的实操呢,不一样的情况下,我们必须要看一下官网,然后看看这个全面的解释是什么啊,也就是呢,官网呢,更多的是一个查阅的功能。
03:52
啊,这个最初来学习的时候呢,这个可能不会去选择官网啊,它是最权威的,权威的,当你有这个争议的时候呢,去找官网啊就没有问题。
04:01
好,这呢,就关于这个官网介绍呢,就这样说一下,然后接下来的话呢,我们看一看关于这个这个工具它的使用当中啊,它也有一个迭代的问题啊,在这个MYQ5.6.3这个版本之前,我们呢,只能够使用这个呢,去这个查看咱们查询语句的这个执行计划,那5.6.3之后呢,我们就可以使用select explain update explain delete啊就相当于我们这种查看那个执行计划呢,就会更丰富一些。啊,这是一个点,然后另外的话呢,提到说在MYSQL5.7之前那版本中,我们如果呢,想查看这叫呢需要使用这个指令,想查看这个field呢,需要使用这个指令啊同学可能看不太明白啊,现在把这个呢说一下啊。诶,刚才呢,其实我们是说到了两个问题对吧,那咱们呢,就以这个,呃,MYSQL8.0,咱们这个艾特硅谷DB1这样的一个数据下啊,有这样的一些表的数据呢,我们来给大家呢做演示说明啊呃,演示两个事儿啊,第一个事儿的话呢,就是我们提到了说咱们在5.6.3之前呢,只能是这个应用,我们这个查询之后的话呢,可以执行这样的一些结构了啊行,我们呢,就先简单的做一个操作啊举个例子啊,比如说我这块呢,叫selecting from,那咱们这个叫student。
05:15
嗯,Student,比如我用这个这两个表吧,那我这样呢,执行的话呢,显然是不是就执行我们这个查询语句了,对吧,那我在前面呢,去加上一个叫plan,哎,这个呢,我们把它呢选中,然后执行,那此时呢,我们能看到的就是当前针对这个查询语句的一个执行计划,这里边有很多的字段,也就是咱们接下来呢,要带着大呢去剖析的啊,这是一块硬骨头啊,需要啃下来,呃,这儿呢,就是我们针对这个查询呢来进行的这个操作,呃,那我们也可以呢,针对的其他的一些行为呢去操作啊这块为了想做一个其他的操作呢,我这这样的啊,我limit一下,咱们查看一下这个表中的这个十条记录啊,走起。行,那我这就随便挑一个,比如说叫做delete。啊,Delete from咱们这个student啊,In当中,然后呢,Where ID等于,那我就选一个这个吧。
06:07
好,那么我要是把这个选中之后呢,一执行啊,就是如果呢,没有其他一些约束的影响的情况下,我们是不是就会把这个第二条记录呢,给它删掉吧,啊没有问题,好,那这时候呢,我在前面呢,去加上了一个叫plan,我们去分析一下当前这个delete操作的啊一个执行计划,来我们走起。诶大家会发现呢,你看现在呢,是不是也能够给我们呈现出来,主要原因呢,就是因为我们现在已经是这个之后的这个版本了啊,那关于这个update呢,我就不说了啊,这里边儿呢,我们想给大家强调的一点是什么呀?就是你看啊,我们现在呢,叫explain这个语句,咱们只是想查看这个语句的一个执行计划,那么我问这个这个这个ID等于二这个数据被我们删掉了吗?诶实际呢,我们发现呢,是不是就没有删掉啊,你看我们这时候再去执行一下这个数据呢,还在,诶所以这块呢,就要查看这个执行计划,并没有真正的去执行这个语句。啊,包括呢,我们这个查询呢也是一样,那咱们这个表中的数据呢,应该是有多少100万条数据吧,那我们并没有呢说把这100万条数据都查出来,只是呢,查看一下它的一个执行的一个计划是什么样子的啊,这个大家一定要去明确啊,好的,那么下一个点的话呢,就是刚才我们看到这里边的说关于这个叫positionition啊,Positionition呢是在这儿的,因为咱们现在呢,都是5.7以后的版本了,现在咱们用的还比较高,是8.0的,对吧?那这个的话呢,就不用我们再使用这个plans啊去调用了啊,直接呢就能够给我们呈现出来,他的意思呢,就是分区的意思。
07:33
一般情况下呢,咱们是用不到这样的一个参数的,所以呢,咱们在讲解这个参数的时候呢,针对于这个position呢,诶positions呢这块呢也是给略掉了,诶大家你会发现呢,整个我讲这个呢,应该你很难看到这个讲的比我这块更详细的这个,呃讲视频也好,还有这个文件也好了啊这呢还是花了很多的时间呢去整理这个啊,尽可能的把这里边所有的属性呢值都给大家呢,诶以例子的方式呢去展现出来。好,那么后边呢,还有一个叫filter的对吧?这个的话呢,我们也不需要呢,专门呢再使用我们这叫诶叫做这个extended去显示我们这个filter了啊5.7以后版本呢,直接一个explain呢,就这些属性呢,就全都有了,行这呢就是我们想给大家强调的这啊几个点啊好接着往后说,那我们呢,可以通过呢叫伊斯兰,后边呢,就加上我们这个呃这个呃山呀改呀查呀是吧,这样的语句更多的话呢,我们主要关注的还是查询的一个执行计划,因为呢,不同的查询的这个执行效率呢,差别是很大的,对吧,所以我们更多的关注的是查询,那你也可以呢,把这些存量关键字呢,换成叫describe啊,CTRLC一下啊,比如回过来我把这个呢改成叫describe啊选中以后呢,一执行,大家有没有发现呢,是不是一回事。
08:45
啊,对的啊行,嗯,这呢是我们说的这个事儿。嗯,这个explain啊,这个一会咱们下边讲到具体的这个,呃,一些特征的时候呢,咱们再强调这个问题啊,哎,就不多说这了,好呃,那么关于这个explain呢,它列出来这个语句当中啊,一共有这样的一些字段,这些字段呢,分别的意思是什么呢?这块呢,我也有个描述ID,这呢是给我们每一个,如果你要是个查询的话呢,呃,这个给查询的这个select啊,为对应关系的一个select呢,我们会对应一个ID。
09:14
哎,我先这样泛泛一说啊呃,有的时候呢,会有一些特例的啊,这个咱们一会儿呢再详细展开,然后这个呢叫select tap啊,就是查询的一个类型是什么啊,就是对应我们这个查询的类型的啊,一会儿就说,然后table呢,就是我们查询的这个表明,那比如我们这个查询语句当中涉及到有两个表,那这块呢,就是table这个字段会显示各自的表明啊,有的时候呢,是表的一些相关的别名啊这样的情况。Parts呢,主要涉及到这个分区的一些信息啊,啊一般呢,我们要是没有分区的话呢,就不会有这个问题了啊下边这个tap啊,针对单表的一个访问方法,这个呢是我们重点要关注的一项。像前面呢,我们提到这个123的话呢,相对来说还算是比较简单的,这个tap的话呢,是咱们在查看这个执行计划啊,说你这个色Q好啊,你那个色Q不好了,这块我们主要看几个事儿啊,我用这个星号呢,都标示出来了,这个tap ks,诶Rose,还有这个S啊,这是我们重点要关注的几个字段。
10:09
啊,它呢,就是针对于我们这时候访问的一个方法system啊呀,嗯,还是这个ref啊啊等等啊,这个不同的访问方的话,方法的话呢,能够给我们呈现出来,它这个效率呢,差别会比较大。然后下边这个呢,叫possible case和K,就是我们可能会用到的索引和实际呢使用的索引啊,然后下边呢叫K啊,这个K的话呢,就是所以呢,实际使用到的这个长度啊,单位呢就是字节了啊,这个参数的话呢,主要是针对这个联合索引呢,是有作用的啊,不是联合索引的话呢,我们直接看它这个事儿呢,直接就推出来了啊,联合索引的话呢,就能看到它到底是用了这个联合索引中的,比如说我们是有三个字段构成的联合索引,你是用了一个呀,还是用了两还是用了仨呀,我们通过这个lengths的话呢,就能够看出来。好,然后下边这个呢,叫ref说当使用索引列等值的查询的时候呢,与索引列呢,进行等值匹配的对象的一个信息。
11:01
啊,这个说到这时候我们再详细展开,然后接下来呢,叫Rose说预估呢,我们能够读取到的这个记录的条目数,Filter的话呢,就是经过过滤以后呢,我们剩的这个百分比,注意这是个百分比,那最多呢,是不是就100%了啊,OK的啊行,然后后边这个呢,叫extra,那我们还可以呢,去额外的提供一些信息啊,一般呢,一说到这个什么什么的,额外的似乎不重要了,但我们这里边额外呢,其实还能看到很多详细的一个场景的,详细的一些重要信息的,所以也是我们重点要关注的一项啊好,这呢,就我们先泛泛的进行了一个说明,接下来的话呢,咱们会一个一个的给大家去讲,只不过这块我讲的时候呢,大家你会发现呢,我的顺序呢,是不是做了个调整。诶,那这个调整的主要目的呢,是为了方便大家更好的去理解咱们这个plan啊这个如果呢,你是最初呢,呃,这之前也没有听说过这plan,或者呢,也没有怎么使用过一次,刚开始来学里边呢,有一些还是有难度的。啊,咱们就一起来带大家去过啊,那为了比较好的去这个展示我们这个算中相关的一些这个属性字段的这个情况啊,咱们这块呢,再去新建两个表,那两个表主要目的呢,是为了体现呢,一个多表的一个联合查询的问题啊OK,首先的话呢,我们去创建这两个表啊,这个呢,其实就比较简单了啊或CTRLCL一下,那我就直接呢在咱们这个里边呢做一个创建。
12:16
嗯,把咱们这个呢,CTRLS我也保存一下吧。嗯,这个放到我们这里边啊,代码这块,咱们对应的这个叫,比如叫零五吧,相当于是我们这个叫plan的一个使用。啊,使用这个一啊,使用一一会呢,我们还有呢,具体的一些详细使用啊,我们再来这个二。好,首先呢,这里边儿我们就说明了去创建表。创建啊。哎,创建表啊,那这个创建表的话呢,我们还得使用具体的数据库啊,这个我们就直接呢去use一下咱们原来的啊,叫艾硅谷DB1这样的一个数据库啊,我们选中。啊选中啊,这时候呢,执行一下,就在这个里边去操作,然后CTRLV啊粘过来,这个呢,是我们S1这一张表来选中以后呢,走起。
13:05
啊,执行成功,然后呢,我们接着呢,再去创建这个S2这张表。啊,CTRLC。那么这两张表的话呢,大家你细节呢,可能一比较发现了,诶基本上这个字段呢,也都是一样的,那为什么我们要造两个基本上一样的表呢?主要呢,就是为了我们进行多表的一个联合查询使用的啊,所以就没有必要呢,非得把这里边这个字段呢起的名也不一样啊,刻意的给自己制造一些困难了啊,就没有必要了啊,我F5刷新一下啊,两个表已经创建成功,简单的来说一下,方便我们后边这块呢,查询的时候呢,大家去理解,我们以这个SE表为例,那其中呢,有这么多的字段来我们去剖析一下啊,这个ID呢是一个主键。啊,ID是个主键,那对应的它上面的是不是就是句索引了,对吧,那针对于我们这个K1K2K3这是三个独立的字段,这三个字段的话呢,我呢都提供了相关的索引,K1是一个普通的索引,K2呢是一个唯一索引。啊,注意K2是一个唯一索引,然后K3的话呢,也是一个普通的索引。
14:03
对吧,跟K1呢是类似的,然后呢,我们接下来呢,跟这个呢叫t part1part2part3这三个呢,合在一起,我构建了一个叫联合索引,顺序的话呢,是先一后二后三,这个大家也要注意一下,然后呢,最后再提供了一个普通的字段,这个上面是没有任何的索引。哎,没有任何的索引,我这呢明确指明我是用的印度DB,那因为印度DB当中我们是有巨索引,有这个二级索引,要是卖S的话呢,就没有巨索引之说了,是这意思吧,好,那这块呢,我们就,哎为了方便大家啊,咱们后边讲这个explain的时候呢,有同学呢,可能就记不住这个表结构了,我先简单的这块呢,哎,保留一份它的这个很小的一个截图啊,我放在这啊。好,那么这个S2的话呢,跟这个S1呢,基本上是一样的这个场景。啊,一样的一个场景,好这就不多说了,然后接下来的话呢,我们需要呢,往里边放数据,放数据的话呢,涉及到这个随机字符串了,这个咱们就我就重新的叫R的STRING1啊,我就不用之前那个了,哎,把这个呢,我们选中了去做执行。
15:00
来来拿过来,这个是咱们叫创建。啊,这个存储过程。哎,存储函数是吧?哎先呢,是提供这个随机的这个字符串的啊,把这个选中的话呢,我们做个执行,那不出意外的话呢,我们又报这样一个错误信息了啊叫log b trust function CS啊前面呢,咱们反复的也都强调过这个点是我要把这个变量的值改成是一啊,相当于把它是一个开启状态啊,因为默认的情况下呢,它是不信任我们对于函数的一个创建的啊,影响我们这个b log文件啊。好,这块我们去执行可以了,以后呢,我们再把上面这个函数呢,去做一个创建。嗯,可以了啊,创建成功这个函数以后的话呢,下边我们去创建具体的这个存储过程,这个存储过程呢,涉及到是两个,一个呢是往这个S1这个表中呢去添加数据,一个呢是往这个S2这个表中呢去添加数据,好。我们走起啊,下边。在创建。看存储这个哎,过程啊,哎两个,嗯,CTRLV这是其中的一个。
16:01
好,执行。这个呢,执行的话呢,是比较快的,因为呢,它不涉及到我们真正去调用,对吧,你要存储1万条数据啊,100万条数据,这个呢执行可能就比较慢一些啊,这个呢,只是创建这个过程啊,它要简单啊透析。啊,选择执行,这里边这些细节的话呢,我们就不给大家去详细说了,咱们在讲上边的时候呢,我也讲过,说如何呢去造这个模拟数据啊,包括呢,我们这里边的,呃,这个这个循环的一个使用是吧?诶这个呢就能就过掉了啊这里边关于这个commit啊,哎,这这就没有这个back了啊commit叫提交,咱们上篇呢,讲这个和delete的时候呢,也提到过,咱们在讲到下篇的第三个大的篇章的时候,咱们到时候再专门的给大家去讲一下提到的这个关于事物的问题啊,哎,先这么着。好,那这呢,我们拉回来两个存储过程呢,我们创建完了以后呢,接下来是不是要调用存储过程啊。哎,调用存储过程,好,那咱们在这个存储过程当中呢,这不就用到我们上边这个存储函数了啊。行调用存储过程,此时的话呢,我们给这两个表啊,都加入1万条数据,有同学老师你为什么要加入数据呢?就是咱们下边呢,去演示这个plan的时候呢,你加数据和不加数据啊,它这个情况是不一样的。
17:12
啊,这个大家要注意一下啊,这个我们加数据跟不加数据的情况不一样,所以我们一定要有一些这个数据,在这种真实的场景下呢,咱们去说明这个Excel的一个使用对吧?哎,这个我们加入一这个1万条数据呢,所以它这个速度比较快啊,这呢是它对应的这个ID是吧,一个默认值啊。哎,应该叫一个初始值啊,好,走起。那1万条数据呢,还是比较轻松的,那添加成功了,添加成功以后的话呢,接下来我们就可以讲解一下这个关于呢各个字段的一个使用了,首先呢,我们先看一下这个数据呢,是不是添加完成了啊,我们可以呢叫select count一个星。From一下。哎,咱们这个叫S1是吧,哎,选中。执行,哎,这呢是1万条数据啊,CTRLC一下,我们再来一个这个SR啊,选中走起啊没有问题,好,那么这个时候呢,我们关于这个explain的这个,呃,使用前的一个数据的准备情况呢,我们就到这儿,然后下面的话呢,咱们具体来讲解各个字段的一个使用。
18:12
好,那下边的话呢,咱们就具体来看一看,关于explain当中啊具体的这些字段的一个使用情况,呃,这块呢,我考虑一下啊,更好的方便大家呢去快速的理解这里边的具体的字段,包括他这个值得使用,呃有涉及到很多的这个案例的展示,咱就一个一个写啊这个就不太现实了,这个时间呢拖得会很慢啊,所以怎么办呢?诶大家呢,你可以看一下我给大家发的这个资料里边,打开一下,我们这个叫资料里边呢,有一个呢叫exce的一个使用是吧?诶我们把这个呢文件调开,其实呢,关于这个大框呢,已经是有了,具体一些代码呢也都有,咱们呢直接就拿这个现有的代码案例呢给大家去说明诶就可以了,呃这呢,我们就直接呢,可以打开一下咱们这块,诶去引入一下我们这个具体的文件就行,对吧。找到一下我们往回翻啊,这个资料关于的一个使用好选中打开。
19:01
哎,把它呢稍微的放大一点好,那这块呢,我们就直接呢,看这个文件呢就可以了,哎大家下来的话呢,你要是想自己学习这个exce的使用啊,也这样去做啊就没问题。好,那么首先的话呢,我们来看第一个字段啊,这块呢,你会发现我讲解的时候呢,并没有按照咱们啊这个字段的一个先后顺序的方式呢去讲解,比如说你看我们这个先呢是ID,再是这个,再是这个table是吧,我们讲的话呢,我是先讲这个table,再讲ID,再讲这个select,这样的话呢,更容易大家去理解,行,那咱们这块呢,就首先来说一下这个叫table这样的一个字段。这个table的话呢,顾名思义就叫做表明查,查询的时候呢,每一行记录都对应着一个单表。哎,我再说一遍,我们这时候呢,你看通过这呢,是不是就做一个关于查询的一个操作了,诶注意一下啊,咱们下边这块呢,我都是拿一个呢,来关于这个查的去演示的,那至于说呢,这个update呀,Delete呀,其实要更简单一些啊,或者说也是同样的道理。那我们这时候呢,再去explain的时候呢,结果集当中啊,是有可能出现多条记录的,那这个大家要首先知道这样的一个事实,那么这时候呢,我们说一条记录对应着一个什么呀,那一条记录对应着一个表。
20:15
啊,就这里边写的说每一行记录都对应着一个叫单表,什么叫单表啊,就是里边有个表,还有个表,这是不是就是叫俩表了是吧?单表呢,就这是个表,这个表那一个表对应的一个数据,那我们这块呢,做一个执行,那就这一条记录,那这个表的话呢,就是我们S1这张表。啊很容易去理解啊,SSE这张表好,那什么呢,叫不是一个单表有两条记录呢,你比如说我们这时候呢,查询的时候呢,用了这个了,从这个表啊,然后再去照按另外一张表,那显然的话呢,会涉及到两张表,那自然而然的我们这个结果当中啊,就会有两条记录。啊,有同学会想,诶,这个很简单啊,事实上呢,也确实不难,只不过的话呢,有的时候我们会看到呢,诶,比如说你这儿呢,明明是有两张表,但是结果集当中可能会出现多一两张表,因为呢,我们在具体的这个查询过程当中,有可能会出现一些临时表的一些创建啊,比如我们在这个union当中啊,因为涉及到要驱虫了,所以会有临时表,那我们可能会看到多余这个两条记录啊,这个呢,我们到时候再说啊,到时候再说,那即使这样的话呢,我们说那三条记录,那临时表是不是也应该算一张表啊,那三条记录那是也是对应的有三个表啊,所以说只要有几个表,我们这里边儿呢,就会有几行记录。
21:27
哎,大家把这个记下来。啊,记下来这个呢,就叫做table啊,非常简单,然后下面的话呢,我们再来说一下这个ID的一个问题啊I的一个问题,那有同学可能会想说ID不就是一个序号吗?这一完了就二呗,你会发现呢,你看我们刚才这个执行的话呢,明明是不是这个ID呢,一个一,下边还是一个一。对吧,哎,就不是你所想的这个点了啊,有点像呢,就是他俩这个呃,优先级啊是一样的,是一种并列的关系啊,是一种并列的关系啊,那么这时候S1跟S2呢,我们看到会先写S1后写这个S2,对吧?那我们把上边这个先写的这个呢就称为呢叫驱动表,后写的这个S2呢,把它称为呢叫做被驱动表。
22:07
啊,被驱动表也就是说,诶老师你看这个不就完了吗?这写S1照S2,那这就叫驱动表,这叫被驱动表也不一定,有的时候呢,我们这个执行优化器呢,它会把我们这两个表呢,驱动和被驱动表呢,这个关系呢,会对调一下,诶他认为呢,这个成本更低,它就会做对调,那放在前边这个呢,我们称为它叫驱动表,后边这个呢,通常就叫做被驱动表了,啊是这样个道理啊,后边呢还有啊,咱们下边再说。然后呢,咱们看这个ID啊,这个ID呢,那应该对应的是对应的是什么,怎么这个是一,这个还是一呢?哎,我们强调一下,这个也很好记,就是在我们一个大的查询当中啊,说每一个select的关键字就对应着一个唯一的ID。啊,也就是说呢,我们出现了几个select关键字,那么这个ID值呢,就会有几个,你有两个select,那这时候ID呢,就一个是一个是二,你要select呢是三个呢,那就ID呢就是123,哎就是这样的一个道理。
23:01
哎,就是这样的道理,好,那我们来看一看,是不是跟我们这个想的是一样的,比如这时候呢,我们从SE里边呢去做个查询,K1呢是等于A啊,这个K上咱们是有一个普通的一个索引的,是吧?啊你看在这啊,在这写的啊啊其实这时候跟这个索引还没啥关系啊,这个索引的话影响的是后边这些字段,那此时呢,我们做一个,呃,这个我这没有写exl啊,只是做一个简单的查询了,那这个查询当中呢,因为只有一个select,诶我就不执行了啊,诶所以呢,它就是有一个ID,那你看我们这个呢,Select一下,他in join,他on他,哎等于它这个是不是也只有一个select。哎,同学说,哎,老师我这有两个这个表啊对,有两个表的话呢,我们涉及到会有两条记录,但是呢,因为有一个select,所以呢,哎,这两呢就都是一个值啊是这样的道理,那你看这个。这个里边的话呢,我们是不是就出现了一个select,又一个select,这是一个子查询,哎子查询呢,有两个select,那这时候我们就会出现ID呢,是一个一,一个是二,哎就是这样的道理。哎,这样道理,那这个呢,是不是我们叫union,那union的话呢,是不是这也有两个select,所以I呢,就一个一一个二行,那下边呢,我们就针对这个情况呢做个说明,你看我们这呢,有一个explain了,选择执行。
24:07
哎,你会发现呢,我们就只有一个select,所以这个ID呢,就是一。啊,就是1TABLE呢,就是SE,这是非常简单的一个操作是吧,这时候跟我们这是不是索引没关系啊,它影响的是后边这些事啊,然后再看这个,这呢是我们两张表,两张表的话呢,你是不是就应该有两条记录啊,但是呢,我们只有一个select,所以说呢,看看这两呢都是一。哎,就这个道理,好,接着看下边这个。说select select s1啊V2K1呢,等于in啊select它这我们可是不是会发现呢,有两个select操作啊子查询嘛,是吧,那这时候呢,我们就会想想到哎,那你就应该是有两个ID了,那你看我执行完以后,里边这个表呢,我们叫S2。啊,然后外边这把呢叫S1,哎,然后呢,这个呢是一个二啊,这个是个一分别对应的就这两个select。啊select啊,通过这呢,我们也能够说明一下,就是此时的这个S1呢,它就要一个驱动表,这个S2呢,我们称为呢叫被驱动表啊,它叫被驱动表啊好,那这个的话呢,稍微有点难度啊,有同学呢说哎呀这个我就已经明白了啊,我就可以去实操了,结果呢,一执行发现呢这块有坑来大家注意看啊,我们此时的这个查询语句当中,S1V2K1IN。
25:19
然后呢,Select k2啊,From s2啊,Where啊,这就一个普通的过滤条件了,这是不是一个表。这是不是也是个表?那这呢,我们想到是不是应该有两条记录是吧,这是其一,那么接着的话呢,这有个select,这有个select说啊,那就应该一个是一,一个是二,那实际情况是这样子的吗?来我们选中了做一个执行。啊,有两条记录不假,一个是S1表,一个是S2表,但是的话呢,我们发现的这个ID值啊,诶怎么一样了呢,是吧,它俩都是一啊。这个怎么去解释?啊,这块呢,咱们要说明一下啊,怎么理解啊,就是这个呢,就涉及到这个查询优化器呢,它一个优良的特性哈,它明明看到了我们这儿呢,是一个子查询,但是的话呢,他对我们这个子查询呢,进行了一个重写啊重写以后呢,相当于是啊,转变为了一个多表查询的操作。
26:10
哎,多表,哎查询的,哎这个操作。哎,大家你想象一下,我们这个外查询内查询,有点像咱们这个编程语言里边提到这个叫嵌套循环一样,比如我们外层的这个复杂度是N,内层的也是N,嵌套的循环相当于是不是就是N方的这样的一个复杂度了,对吧?那如果说我们要改成这个多表连接的这种方式呢?那这是一个N,这是个N,它类似于呢,是不是叫N加上N相当于是一个2N的这样一个复杂度。啊,或者叫还是一个on的一个复杂度对吧,那明显的话呢,我们说这个子查询的这个效率呢,呃,如果说同样的情况下呢,我们要选择是不是优先选择用多表连接的方式啊,啊效率会更高一些,那么我们当前的这样的一个子查询优化器呢,在判断以后发现说你这个呢,实际上是可以改成一个叫多表查询的,它呢,实际上就帮我们做了一个改造优化,那优化完以后的话呢,因为变成多表查询了啊,就像我们上面类似于这样的场景一样,是不是就只有一个select了。
27:04
啊,那还是这两个表,那既然只有一个select克拉,那就全是一了。诶,所以这块呢,大家相当于啊,我们是经过这样的一个查看呢,知道了哦,优化器呢,帮我们做了一个重写,诶通过这个呢,就看出来了。好,接着我们再来往下分析啊,这呢我们叫union去重说select union select新from,这呢就是两张表,那应该有两条记录是吧,按照我们目前的分析来看,那么有两个select,那就应该一个是E,一个叉,诶没问题是吧,那我们实际上去执行一下看看。好,大家会发现呢,结果集当中啊,有三条记录,诶有三条记录S1S2,那由于呢,这是两个select,所以一个是一,一个是二没问题对吧,那实际情况呢,我会发现呢,怎么又多了一条记录,而且多的这条记录这个表啊,它叫UNION1逗号二。啊,那么这个一跟二呢,实际上就是我们这两个ID啊,UN1UN2,哎为什么要UN呢?这个时候呢,就涉及到我们这个UN这个关键字的一个作用了哈,它呢,是不是叫诶这个取并集是吧,这是S1啊那他们两个呢,有可能会有一些交集的部分啊,这是不是S2,然后交集完以后的话呢,Union相较UN奥来讲,它是不是还要做一个去重的操作,把重复的数据呢,我们要诶砍掉一份是吧,留一份就可以了。
28:21
啊,留一份就可以了,那么这时候我们要去掉这个重复数据的话呢,你我们得怎么着在一个临时的表当中去做这样的去重操作,相当于先把这个SE呢,这个数据呢,先,诶这个画一个圆圈,先先先查出来,然后S2的给查出来,咱们先做个临时表,然后在这里边儿呢,我们去找这个重复的这个数据。诶,那么怎么能看出来是临时表呢,大家看这块儿呢,其实就可以了啊,Using temporary啊,这个就是临时表的一个意思。啊,咱们到最后的时候讲这个啊行,那既然是个临时表的话呢,那这个表这个名叫啥呀,那实际上我们就说联合一下S1和S2,就是你这两个ID对应的这两个表啊过来的,所以这块呢,就用它来表示了。
29:00
那么这个ID这块呢,写啥呢?啊,那大家你想想,你说我们写ID是三吧,呃,ID是三,那就意味着我们多一个select啊,因为我们说有一个select的话呢,是不是就多一个ID,咱们这明明是不是也就只有这两个select,你也没有第三个,所以写三呢不合适。对吧,那那写啥,那就写个闹吧,哎,就这样个道理啊,它表达的就是我们把这两个结果呢给它,哎这个合并在一起,取得这个临时的一个结果集,OK啊,这个大家呢,可能是稍微理解上差点意思是吧,包括我们这个呢,叫union result啊,这个咱们下边呢,再去讲这个select type,就是它查询的一个类型是吧,就是一个union以后的这个结果机啊好,那么知道我们这union以后呢,咱们顺带呢,你看下这个UN all哈,UN all的话呢,是不是就根本就不去重了呀。那既然不去重了,你说我们还有必要呢,去建这个临时的一个表吗?那是不是就没有必要了,所以说呢,我们这个呢,去查询的时候,大家发现呢,就是实打实的这样两条记录。啊,没有这个临时表的事儿啊,因为它不用去重啊就完事了,行,那么这样的话呢,咱们就把这个table和ID呢就说清楚了啊,相对来说呢,这两个是比较简单的这个字段啊,那么关于ID的话呢,咱们最后呢,还有几点说明给大家强调一下。
30:09
啊,大家看这啊,说成ID呢,如果相同,可以认为呢,是一组从上往下这个顺序呢去执行。哎,从上往下的顺序呢,去执行,哎像我们刚才呢这块呢,呃,查看这两个算不同的值了,咱们在一开始的时候呢,是不是,哎像哎这哥俩的话呢,它俩都是一样的值啊,就是他俩这个优先级呢,算是一样的啊说在这个所有的组当中啊,这个ID值呢,越大,这个优先级呢就越高啊,就要越先被执行啊,你比如我们像这一个子查询的方式啊,这呢是一个外部的,这是一个内部的,这个叫S1,这个叫S2,两条记录啊,然后这个呢,是不是ID是一,这个ID呢,是不是就变成二了,那我们要执行的时候呢,叫先要执行套。啊,比如我们从外边取一条记录,然后放到里边,里边呢咔咔一顿执行,那它的优先级就比较高一些嘛。啊,这个注意一下啊,说ID号呢,ID号的每个号码表示呢,一趟独立的查询一个so后的查询的趟数呢,越少越好,哎,那当然了。
31:04
啊,你比如说我们这块呢,要是三层的这种嵌套的话呢,相信这是个一,这是二是不是就成三了,那就不太好了,哎,而我们这个一开始的话呢,说这是个一,这也是个一,那我们是这个呃,多表连接的方式呢,这个ID是一,这个ID也是一,它是一个并列的关系啊,这就不涉及到一趟一套不是这种嵌套的关系了,这个要好一点,对吧。好,那咱们把这两个字段呢,就说清楚了。
我来说两句