00:00
好,那么接下来的话呢,我们来看一下这个第三个字段,叫做这个select type叫查询的一个类型是吧,这是什么意思啊,说这个MYSQ啊,为每一个select的关键字呢,代表的一个小查询,那我们说每一个select关键字呢,是不是对应一个独立的一个ID啊好,那么为每一个这个查询,那其实是一个小查询呢,把它呢,呃定义一个称之为叫select type这样的一个属性。啊,查询的一个类型属性,那有了这个之后呢,我们就知道了,诶注意看这句话,知道了我们这个小查询啊,在整个大的查询当中扮演的是一个什么样的角色。你比如说我们这是一个呃一个表,然后呢,用I上这是又一个表,然后呢,你这俩是处于什么样的角色呢?是吧?然后呢,这是一个外部的一个查询,这是一个内部的查询,你内部的查询呢,在我们整个外部这块呢,扮一个什么样的角色呢?对吧?诶这就都是我们所谓的叫每一个小查询的一个角色,这就可以通过我们这个的字段呢,进行一个查看,那么这个字段的值的话呢,也比较多,你看这么多呢,那其中呢,有的这种是不太常用的,咱们就不多去给大家举例子了,咱把那前面这块呢,诶还算是比较常用的,但是其实里边也有一些不是很常见的,咱们咱也尽量的给大家去举举例子啊,诶这块呢,给大家去统一的说明一下好了,那这块我们就回到咱们这个测试的这个表当中来进行一个查看。
01:15
哎,来看我们这一点啊,这块呢,就对它呢进行一个简单的描述啊,大家呢,记住这个意思啊,就要我们上面的ID呢,说只要有个ID,那就对应着我们有个磁带关键字啊,只要呢有个表,就对应了我们表中的一条记录啊,就是我们最终的结果集中的一条记录是吧,那这个呢,Select type呢,就是来这个确定咱们当前这个小查询在大查询当中扮演的是一个什么样的角色。好,首先我们来看第一个,比如我们这块呢,就是一个极其普通的一个查询了,这个应该不能是再普通了,对吧,那此时的话呢,我们做一个EXCE1执行它的这个值呢,叫做simple啊,就是你很简单啊,你非常简单就是一个simple。OK,这是一个他的情况,那我们呢,是这种的啊说S1呢一呢照一个S2,那我们有两张表,是不是就应该有两条记录,对吧?那那这时候呢,ID是怎么算呢?只有一个select,所以说ID呢都是一对吧?哎,这时候我们选中执行是不是就这样的场景,然后这块呢,你注意它也是一个simple。
02:08
哎,这也是个simple,就我们这个查询语义当中呢,你不包含unit,或者是这个子查询的话呢,我们都认为呢,是这个叫simple。诶不包含UN,不包含这个此查询啊,都是这个simple啊,其实这时候你看对应的是不是都是我们这个一个select这种是吧?好,那下边的话呢,我们来看一看,包含这个叫UN,包含这种此查询的这种情况呢,我们来介绍一下,这个呢,通常是有几个小查询来构成的了,那咱们最左边的这个呢,来查询的类型呢,叫做primary啊,也其实也就相当于我们比如说呢,这个去连接上的这个union的这个,那那这个时候呢,我们呢,就是一个primary。啊,然后呢,如果呢,你是一个外层的啊,嵌套的一个内层的子查询也没有呢,优化完以后呢,把它改成个多表连接了,那就是这样个子查询的结构,那我们外层这个呢,叫做primary啊,就是这个意思啊。好,这是我们说的这个外层,然后呢,咱们再说一下这个啊,说这个针对于UNI和UN奥的这种场景啊,咱们上边这块呢,其实说了两个场景,一个是UN的,一个是紫查群的是吧?诶他们俩的这个外层呢是一样的,然后呢,专门呢,我们来说一下这个UNI和uniorde他们的这个内层,说这个内层啊,或者说呢,就是这个UN后边的这个啊。
03:13
哎,不能叫这个内层了,就是子查询才叫内层哈,这个unit的话呢,就是前边这个跟后边这个啊,那我们后边这个所谓的这个子查询,呃,这个这个小的查询,它呢这个值呢叫做UN。啊,它的一个质量叫做union啊,那那关于我们这个union和union all里边这个union的话呢,它因为要去重,是不是有这个临时表是吧,那这个临时表的这个呢,Select type呢,它叫union result。啊,这一说呢,大家可能有点懵,来,咱们直接呢上这个具体的例子啊,那这是一个S1,这呢是一个S2,这是不是union啊,那UN的这种场景呢,我们说左边这个表呢,是不是叫做primary啊,没问题,右边这个表呢?呃,因为我们这种union的场景的话呢,右边呢,都叫做这个UN了,诶所以这块大家看到的是这个UN。没问题是吧,啊,这个呢,咱们等一下说啊,然后呢,下边来看这个UN all。
04:00
UN的话呢,一直行啊,跟上面的UN呢,其实是一样啊,S1S2啊,一个一,一个二,一个primary,一个UN,比较简单吧,就相当于是我们这个表呢,是UN一下这个表,OK,那么区别就在于我们这个union的话呢,它会多一条记录,刚才我们也解释了,因为它要去重,所以呢会使用这个临时表,所以呢这叫UN啊,一和二这两个表呢,构成了一个临时表,那么对于这种场景的话呢,它的这个select,呃,这个type的话呢,叫做union。啊,联合的一个结果啊,这个呢也说了,就是他啊就是他啊行,那么接着我们来看这个子查询,子查询的话呢,我们说外查询对应的是这个primary已经说过了,那么关键我们就看到里边的这种情况啊,呃,这块提到说如果包含子查询的这个查询语句啊,不能够转化为对应的,呃,这其实就是我们转化成这种多表连接的方式了,呃,咱们刚才那上面不是举过例子,有的时候呢,这个查询优化器呢,它会将我们把这个呃子查询呢,是不是给我们改成是一个多表连接的这种方式的,对吧?诶那这块呢,首先说的是就没有改成这个多表连接的方式啊,并且的话呢,咱们这个子查询啊,它也不是相关子查询。
05:07
咱们再讲上面的时候呢,专门不是也讲过什么叫相关子查询了啊,这我就不在这儿去多说了啊,那如果呢,你还是一个不相关子查询,那此时的话呢,我们里边这个写的呢,就是一个非常简单的叫sub query,那也就说是一个子查询的意思。好,大家来看这个呢,是Y查询的S1这个表,K呢in,我们里边的这个叫S2这个表,他俩呢也是一个,呃,不相关的子查询,对吧,那这时候呢,一个S1,一个S2,两个select就一个一,一个二,外边这个呢叫primary,里边这个呢叫query啊查询的意思。啊,比较简单啊比较简单好接着再看说呢,还是你不能够把这个子查询呢,转化成是这种多表连接的方式,诶此时的话呢,我们这个子查询,注意是相关子查询了。哎,相关自查询,你看我们这块呢,诶K1呢,In select k1from s where s一点K2等于S2点K2,是不是我们在这个内查询当中使用了we部的这个表了,那么此时的话呢,它就是一个相关自查询,那要是相关自查询的话呢,这个位置呢,就不叫这个sub query了,这个我们称为呢叫dependent sub query,哎,走起。
06:13
你看叫dependent subry,这个dependent就是有相互这个依赖关系的啊,就是相关性的这种查询。啊,非常的清楚是吧,哎,说需要注意的是呢,这个select type呢为dependent,这个查询可能会被执行多次。啊,因为我们相当于是,呃,外层呢,传个值进去,里边呢执行,然后再传一次再执行,再传一次再执行,这是不是就我们所谓的执行多次对吧。好,这个呢叫depend啊,注意一下主要就是相关查询了啊,接着再往下看啊说呢,在包含union或者UN的这种大查询当中,如果呢,各个小查询呢,都依赖于外层查询的话,诶,都依赖于外层查询的话,那么除了最左边的那个小查询之外呢,其余的这个select呢,都叫dependent unit。啊,这个大家可能有点懵啊,这个稍微缩小一点啊,看这个例子说呢,Select形容from,然后where呢,Ke in啊这个你首先来看呢,它算是一个呃子查询了是吧,这是外查询,这内查询啊,那外边这个呢,是不是就要primary了,没问题啊,然后里边这块的话呢,我们发现呢,这是有一个S2的表啊,还UN上了一个S1的这样一个表。
07:19
诶,这个有点意思来,你看这是我们选中以后的执行,这呢提到了,你看有这么多条记录啊。呃,首先的话呢,这个是S1,是不是就这个啊,然后这个S2的话呢,是不是这个,然后S3的话呢,那不是S3了,这个呃,第三条记录呢,是不是S1就这个,又由于我们这段行动是UN啊,需要去重了,是不是又得需要一个呃,临时的一个表,所以这呢就要呃这个unit result这个咱们都说过了,这个UNIT23是不是把这两个合在一起的是吧?哎,这个大家好理解啊,那么关键呢,我们想解释的就是这样这两个位置。啊,这块呢叫primary,因为它是一个外部的一个表了,那为什么我们这两块呢,显示的叫这个S也好说,因为它是内查询了嘛,这个呢,诶你是S2的UN上的我们这个S1,所以这个呢叫UN没问题,关键那就是它俩呢,你看加上了叫dependent。
08:06
啊,也就是我们所谓的是不是诶相关的一个意思啊,哎,这块提到说你想查询的依赖于外部查询啊,这块有同学可能会想说,老师这个里边我怎么也没看到说这是个相关的查询呢。对吧,哎in,哎,外边里边这个表我们也没有用到外部这个表啊,诶这个原因呢,是因为我们这个in的操作啊,其实在很多情况下呢,都会优化器呢,帮我们改造成是用exists这种方式。啊,这个咱们在前面讲这个上篇的时候呢,是不是也提到过这叫exist是吧,那那我们要改造成这个ex exist的话呢,其实就会把外边这记录要放到里边,其实这时候就变成了一个相关咨询,所以这块呢,其实也算是进行了一个重构啊,那重构以后的话呢,里外就有相关性了,所以相当于呢,在你这俩前面呢,就加了这个叫dependent啊dependent。看,就是这个道理。啊,这个大家可能理解起来稍微有点难度啊,再体会体会,然后我们看下一个啊,说对于包含派生表的查询,该派生表呢,对应的查询的select time呢,就是叫dived啊,其实就是派生的意思,诶这什么意思?来走起啊走起。
09:07
啊,其实就这个位置是吧,看一下啊说呢,我们去select形from,诶大家你会发现呢,我们这个位置呢,是不是一个查询语句啊,哎,这个查询语句的话呢,我们把它这个结果呢,是不是作为了一个表,然后确定下来了,哎,然后呢,去查询这里边的具体的呃,这个字段的一个信息啊是这意思是吧?啊那这个时候的话呢,首先你看啊,我们这是一个select,这是一个SELECT2个select了,那这块呢,肯定是一个一啊一个二了啊那里边这块呢,我们对应的是不是S1这样的一个表没问题,那外边这块呢,这个表s from是不是应该是这个表了,诶这个呢,就是我们所谓的就是派生出来的一个表。啊,派出来表,所以我们用的这个单词呢,叫divided啊,那二是什么呢?就是你这个ID2构成的啊,所以叫DIVIDED2啊就这意思,你看我们上边这块呢,哎,咱们把这个再重新选中一下执行这个呢,实际上是叫这个UN了啊UN的话呢,因为是个联合,所以就不可能是一个了,诶它就是二逗号三啊,我们这个呢,就是派生呢,你就只有这一个表,所以呢叫DIVIDED2啊,就没有什么逗号三呀,积极的了啊这个意思,这就是他这个table。
10:12
啊,这个名字啊,那在我们这个位置的话呢,就相当于是你针对这个S2,呃,S1这样一个表呢,我们是不是给它派生出来的一个表啊,它呢叫做d divide啊,这个对应的就是D2。啊,把它呢作为一个查,把查询结果哎,作为一个表给它固定下来,我们把这个呢就称为叫排程表。好,接着再往下看。那这边提到说,当这个查询优化器在执行包含子查询的语句的时候啊,选择了将子查询雾化之后呢,与外层的这个查询进行连接操作,呃,该子查询的对应的select呢,就是啊materialized啊,这个大家一看就彻底的晕圈了是吧?哎,来咱们执行起来啊。那我们能看到呢,这个结果呢,有这样的三条记录哇,有三条记录啊,我们该解释该如何去解释呢?来看一看select from1说where k1呢in啊select k1呢,From这个S2,首先呢,这是不是有S1啊,最里层的那是不是有个S2啊啊没有问题,好,那我们该怎么去看待呢?哎,这个时候你看啊select啊K1FROM这个SR,这时候我们就把这个查询的结果呢,转化为了一个物化表,相当于呢,你可以看作是呢,只包含这个K1这个值的这样的一个,呃,几条记录啊构成的这样的一个结果集。
11:25
啊,这就可以理解成是一个物化表了啊,那么此时的话呢,你这个物化表呢,呃,这个呢,相当于是个子查询,针对的就是我们这个ID呢,是二的这个呢查询出来的啊,所以叫sub克二啊in这不是个查询嘛,哎,萨克二啊,所以这呢就是这个表的名字,这样呢,就是我们所谓的这个叫A物化了。啊,就是物化了把这个结果的话呢,相当于是我们直接呢,是不是就取这样的几个算式叫常量就可以了呀。哎,所以你看这块呢,对应的是一个呃,Select,所以这块呢,就都是一这个值,那都是一个简单的查询。啊就可以了,哎,就是把我们这个结果呢,相当于结果集呢,给它做了一个雾化啊,供我们外层的一个查询呢,去连接使用,行,那这样呢,就是我们把这个相当于是叫select type呢,诶就给大家说清楚了,呃,整个来讲的话呢,应该说这几个算是比较基本的啊,咱们还没有真正触碰到跟这个索引相关的这个问题呢,是吧。
12:16
好,那么这个第四个点的话呢,因为也比较简单啊,所以咱们直接呢就一起来说了,看一下这个课件啊,关于这个partition,这个partition的话呢,翻译过来就是分区的意思啊,Part呢,不就是部分是吧,它呢代表分区表中的命中情况,非分区表的话呢,该项的值为no。啊,分区咱们现在呢,实际上呢,都是用的一个,呃,这个这个这这咱们因为这个数据量呢,其实也没有多大哈,诶这个数据页呢,是有多个,然后没涉及到这种分区的这个概念啊,区域啊,段啊表空间啊,这咱们在前面呢,是提到这个底层结构的时候呢,都提到过这个概念,对吧?那如果呢,不涉及到分区的话呢,这个值呢,它都是这个闹,哎都是这个闹啊,然后我这块呢,也专门呢写了一个关于这个分区的情况啊,ID小100的时候呢,在这个分区里边,其他呢,放在这个分区里边,明确的这块指的,然后这块呢,我们去做一个这个查看,诶看一下它这个positionition这个数据呢,相当于它记录的是在哪个分区的。
13:09
啊,就这个意思啊,也比较简单啊,这里边儿呢,咱们就简单说一下就行啊好,那这样的话呢,我们把这个三次呢就结束了。好,那么接下来的话呢,咱们来看一下这个第五个字段,叫做这个tap啊,下边呢,我加了一个星表示呢,就是我们这儿呢,是第一个谈到比较重要的一个字段,前面这些字段的话呢,大家整体上呢去熟悉一下就可以了,难度也不是特别大,那从这个type开始的话呢,如果我们ex explain后边加的是一个具体的查询语句啊,那么这个查询语句呢,诶,我们就涉及到了跟这个索引的一个相关度了。那这个不同的这个查询语句当中啊,用上索引和没有用索引,以及呢,我们这个索引呢,又分成具体的,比如说这个主键索引,唯一性索引,还有这种普通的索引,包括呢,还有这种联合索引,对吧,那不同的索引呢,呈现出来这个type呢,它的情况呢,也都是不一样的。啊,那这个ta呢,它强调的点是什么呢?它就是用来刻画说这个,诶,MYSQL对某个表的执行查询时的一个访问方法。
14:07
那我们对应的是一个一条记录呢,相当于就算是一个表了,那针对这个表的话呢,它会有一个具体的type,就是你这个访问的方法是什么样子的啊,那么这里边儿呢,有具体的一些这个访问的方法啊,我这儿呢都罗列出来了啊,虽然说这里边比较多啊,但是我在罗列的时候呢,也会有一定的顺序,那就是越靠前的话呢,越是我们希望看到的。啊,越是我们希望看到的,最不希望看到的,是不是就最后一个O啊,那就相当于你真的就是进行了一个全表的一个便利,一条记录一条记录呢,给它都取出来,这个呢,我们认为就是最糟糕的一个情况,对吧?啊越往前的话呢,这个效果呢,肯定是越好一些的,好,那么接下来的话呢,咱们就一个一个的给大家去做一个介绍啊,看看呢,在什么样的场景下,诶是这样不同的这个值,那通过这个的话呢,大家就能够看到我们这个色库语句写完之后的话呢,呃,如果说呢,我们是比较靠后的啊,尤其呢是我们出现在后边这几个场景下的时候,大家一定要小心了啊,我们这个效率呢,可能就不太理想,那尤其是最后这两个那更是了。
15:04
OK,那我们来看看前面这些所谓的好的是一个什么样的情况,首先呢,第一个呢,叫做system啊,这块我们还是直接回过来在这儿来去看啊。诶,针对于单表的一个访问方法,好在这看说单表中只有一条记录,并且说该表呢,使用的这个存储引擎的统计数据是精确的,比如说MY和这个memory,那么对该表的一个访问方法呢,就是system啊,这个大家看完之后呢,八成呢是这个脑子一团浆糊,不知道在说什么,来我这块呢给大家去解释啊,首先的话呢,你看我这里边做造一个这个简单的表,非常简单,一个I连这个约束也没有啊,这个MYS,然后呢,我往这个表中添加了一条记录,好我们首先呢把这个呢选中去做一个执行。那可以了,但是执行完以后的话呢,我们select形from这个T的话呢,其实你会发现呢,是不是就只有这一条记录,对吧?但是这时候你看我刻意的是用这个MY前面的话呢,其实我在某一个场景下,我提到过针对于像MY这样的这个存储引擎的话呢,诶我们如果查看这个表中的这个count星,诶是不是我们要查看这个表中的一个记录数,对吧?他呢不会呢,是去把这个表呢再变历一遍,看看有多少条,一个一个的数一下,他呢直接呢就有一个变量呢,去记录了一下我们这个表中的一个记录数,这就是我们所谓数,所谓的就是它统计数据呢是精确的。
16:19
那相当于如果我们要查询这个抗清的话呢,他直接呢,就没有去找这个表,直接呢就把这个结果是多少条给我们返回了,要1万条,直接呢就返回1万这个数啊就这个意思,好,那么我们只有一条数据的情况下呢,我们去做一个plan,诶大家就会发现呢,此时这时候呢,它的这个tap呢,叫做system,这是性能最高的这种场景。啊,性能最高的就直接呢,就我们就把这个表中的这个记录直接就拿过来啊,输出这叫system级别的。啊,那这个相对应的话呢,如果你用这个memory的话呢,也可以啊,也可以一样的情况呢,去演示也是一个system,那有同学想说呢,我要再添加一条记录呢,来你看我们这块呢,执行一下。是不是我又添加一条记录,那又添加一条记录,这有两条记录了啊,Select from t2条记录,那我们这时候呢,去explain会是什么样子呢?来,走起。
17:08
好,大家会发现呢,此时呢,是不是就出现我们说比较糟糕的这种场景,是不是叫这个奥啊,诶,那因为啥呢?因为咱这里边儿两条记录,你也没有设置这个索引的问题,那就是真的是把这个表中的数据拿过来,然后呢,一条一条的这样的进行一个诶全表的一个遍历啊这就是个哦这样的场景。行,那这呢,你要加上索引呢,跟这个不加索引,这个肯定这个type呢还是不一样的,行这个呢说说到这儿,然后呢,大家看一下,我们现在呢,使用的是这个动DB,这个in动DB的情况下呢,我们造了个表,这个我上面要T,这叫TT吧。啊叫TT啊怪怪的是吧?来造完这个表之后呢,往里边呢,添加了一条记录,也是一条记录,走起。好,然后的话呢,你看此时呢,我们去做一个plan,大家想象一下这个结果呢,会是一个什么样子的,来走起。好,这块你看它是哦,那我们这个表中呢,只有一条记录,为什么它就不是system呢?就是因为呢,咱们在这个MY这个这个DB当中啊,它统计数据啊,不是精确的啊,它不是有一个变量去记录,而是呢,就得是去这个表中呢,哎,数一下看到底有多少条记录,所以呢,你也不是这个索引,所以呢,就实打实的去这个表中呢,去遍历了。
18:12
啊,所以呢,这就是一个all的一个场景啊,所以大家理解一下。行,后边的话呢,咱们还会讲到这个out场景啊,先往下说。最好的话呢,是不是就是这个system呢,这是最理想的,然后呢,其次的话呢,哎,这块我们就提到这个叫做cost,那就是这个常量级别的来看一下说,当我们根据主键或者是唯一的二级索引与常数进行等值匹配的时候呢,我们对应的这个就叫做cost。哎,那我们这里边呢,针对C这个表主键呢,是不是叫ID啊,咱们稍微放大一点啊,主键呢叫ID,我们这里边是不是针对这个K2它呢是一个unique是吧,所以说呢,这是我们在这个外条件当中,我写的主件啊,以及呢,写的是我们这个unique的这个场景,这后边呢是个常数,那这个时候呢,我们的type呢,就都是这个cost,这个我们认为呢,也是非常不错的这种效率。
19:01
啊,非常不错的,你像我们这个ID它是主键,其实对应的是不是也是一个唯一的呀,那我们在这个具体的啊,B加数当中,咱们找到最后的这个,呃,叶子这个节点的时候呢,是不是直接呢,你找到这叫10005就可以了,不用再往后去找了,因为它是唯一的嘛,那这个K2呢,也同样的道理,所以这呢都叫这个常数级别的。啊,性能是不错的啊,这就过了啊,接着往下看说呢,在这个呃啊这块如果我们改成要K3,简单看一下K3的话呢,因为就不是一个唯一的了,它只是一个普通的一个索引,你看这时候呢,是不是就不是我们这个叫cost了。对吧,哎,这个大家注意一下啊。好,再拉下来说,在这个连接查询当中,如果呢,被驱动的表呢,是通过主键或者是唯一的二级索引这个列等值匹配的这个方式进行访问的。啊,那么这个时候呢,被驱动表呢,就是这个EQ啊EQ,然后ref说如果该这个主键或唯一索引的是个联合索引的话呢,那都进行这个等值比较啊,所有的所性列都进行等值比较啊,就这意思,比如我们这里边呢,是S1,我们叫inner,照一下S2啊,那这呢,显然是不是有两张表,那两张表的话呢,是不是我们就会有两条记录啊。
20:07
啊,那只有一个select,是不是ID都是一对吧?好,那我们看一下这个type,我们相当于呢,是这两个表做连接的时候呢,我们从S1里边挑出一条数据,然后跟S2里边呢做匹配,哎,那我们从这也能看到它是一个驱动表,这呢是一个被驱动表,然后这里边儿取一个啊跟这个连接,再取一个跟它连接,所以这个type呢是个O。啊,咱们下边还会去再讲哦,啊,然后主要来看这儿,那我们对这个S2来讲呢,诶,咱们这时候呢,它连接的S1呢,那这块都是主键是吧?哎,都是这个主键,说被驱动表是通过主键啊,或者唯一性啊,唯一的这个二级索引进行等值的一个匹配的,就是我们外边这个呢,其实查询一条记录之后呢,在我们内层来看呢,其实你就是一个具体的值了,然后我们这呢,是通过主件呢,跟那个具体的值去联系的啊那么这个内查询当中啊,我们这个呢,就叫做,诶这个不是内查询了,就是我们这个被驱动表是吧?哎叫EQ啊ref啊,这个性能呢,其实也不错。
21:01
啊,性能也是不错的。好,再往后看说,当通过这个普通的一个二级索引与这个常量呢,进行等值匹配的时候啊,那我们对应的这个叫2EF啊,当然你看我们这个场景啊,我们选中了做一个执行。哎,你看这是我们这个K1呢,就是一个普通的一个二级索引吧。哎,在这是吧,哎,普通的二级索引,然后我们跟一个常链的做一个匹配啊,那么此时的话呢,它就是这样一个情况。哎,就这样情况啊,哎同学说老师怎么刚才你在这块呢,整了个K3的时候呢,哎,这个我们怎么看到的这个呢,是一个奥呢,哎同学有点懵是吧,说老师这不也是一个普通索引吗?哎,那跟这个这不一样吗?咋就咋就这个结果不一样呢?哎你看我们这个K3的话呢,主要原因是因为它这是不是一个work差类型啊,这个是个work差类型,我们这呢写的是不是不是一个work差类型。啊,那这时候呢,会出现一个隐食转话,那一旦呢,出现这种隐式转化了,我们就需要用函数,那一旦呢,给我们这个索引上面作用于函数的话,就不会应用我们这个索引了,说白了我们这时候这个K3啊,跟你写的用咱们这个叫common field呢是一样的了。
22:03
啊,那如果说我们要加上这种单引号的话呢,那是不是就变成字符串了,哎,大家你再看我们这个凹的这个场景,它是不是就变成2F。啊,就是这个意思啊,行,这个大家能明白,我这想表达的这个意思啊,这个表达的意思,这个我们K1的话呢,就是个普通的啊,就是RF行说说到这儿啊,然后接下来。说当对普通的二级索引,普通的啊进行等值匹配的时候呢,该这个索引的这个值啊,还有可能是个闹啊,比如我们基于这个场景的基础上呢,又补了一个说K呢,还可能是个闹啊,那这个呢,其实也比较简单,就是ref的或者呢是个闹的场景。是吧,还refo no,这个要清楚了,这个就只在补个no就完事。啊就过了啊,然后下边说单表访问方法的时候呢,在某些场景下呢,可以使用诶这些啊这三种索引合并的方式来进行查询啊什么意思啊,就是大家你看这啊说呢,这个从一这个表中where k1等于AO,注意这块一定得是个O啊O这个K3呢等于一个A,那这时候呢,我们说诶可以是它,也可以是它,K1和K3上呢,咱们说都有这个索引,而且都是单列索引。
23:08
一般情况下呢,咱们在写利用过滤条件查询数据的时候呢,只能够是使用一个索引的。啊,一般呢,咱们查询只能用一个索引,那现在的话呢,这是两个单列索引,我们合在一起来,这个奥的关系实际上就跟呃并集的关系,那怎么办呢?咱们就可以考虑呢,把这两个呢都合在一起,构成一个呃union的一个方式啊叫墨纸是吧?诶合在一起我们构成了一个相当一个虚拟的一个大的索引一样啊啊我们呢,去做一个并集的一个查询。啊,这个大家注意一下啊,你看这个位置我们要改成是暗的呢。哎,我们选中再去执行,你看这时候呢就变了。啊,这就变了,其实你看相当于是我们只是用了其中的一个缩引,跟这个K3呢就没啥关系了啊,这两个注意一下啊,哎,这个我们得用这个O啊才可以啊,选中执行啊,你看这个位置呢,是不是写了俩,相当于他俩都用上了,就是墨纸就合并的意思。嗯,过了啊好,再往下这个呢叫unique sub query啊,这个可能稍微有点难度了,看一下它呢是针对于在一些包含了in子查询的这个语句当中,那如果查询优化器呢,决定将in呢转化成这个exist子查询,并且子查询呢可以使用到主键进行等值匹配的话,那么该子查询的执行计划的type呢,就unique sub query啊,基本上大家肯定有看懵了,还直接上例子。
24:24
说select星from s1,说where呢,K2呢,In啊,Select ID from s2啊wheres1.k等于S2.k,那首先呢,是不是有两个表?啊,这个我们直接呢,运用完以后呢,给大家解释啊,首先呢是有两个表,然后的话呢,我们看到外边这表呢,是不是,诶这个字段呢,放到里边了,所以这是个相关的,所以叫dependent sub,这个叫primary啊这是一,这是二,两个select没问题是吧?好,那主要我们看这块啊,在这里边呢,我们外层这个是all呢,也可以理解,因为我们从外边取一条数据呢,要放到里边,呃再取一条放里边,再取条放里边,所以外边来看就是个奥,然后里边这一块的话呢,注意我们这个是in的方式呢,其实它把呃这个查询液化器哈,来把我们这个in的子查询呢,给转化为了一个叫exist。
25:08
啊,Exist呢,就是我们说存在的意思啊,那重新整合以后的话呢,在里边呢,就会出现我们让那个K2呢,跟我们这个ID呢,去做一个等值比较的情况。啊,你得是K2是不是得等于我们这个ID的这个值的情况,那相当于里边的话呢,我们就出现了这个,呃,等于这个情况呢,我们ID呢,是一个主键吧。啊,是一个主键啊,应用上它这个主键索引了,哎,这时候我们就发现它这个叫unique啊sub query。啊叫unique sub啊,你看这时候呢,诶,你看这是不是有这个主见的意思啊。啊没问题,而且呢,这个S2呢,这个K1啊,是不是也用上它了,哎,这个意思啊,好这呢就是我们说的这个啊,这个呢,稍微是有一些难度的啊,大家需要去体会啊,就通过这个呢,我们也能看到呢,它是把这个in呢给我们改造成了exist啊。好,再往下说,如果呢,使用这个索引获取是某些范围区间的记录,我们就叫这个。
26:02
那叫比如针对我们这个K1。说这个K1啊,它是in啊ABC啊,相当于这就算是一个范围了,那么此时的话呢,我们执行啊,这就是一个级别的。或者的话呢,我们是大于A啊,小于B啊,这呢也算是一个润质级别,那也能够去使用我们的这个索引。啊,也是没有问题的啊。好,再往后看啊,说当我们可以使用掉索引覆盖啊,但是需要扫描全部的索引记录的时候呢,该表的访问方法呢,就是index。啊,就index啊,呃,这里边提到其实这个词呢,大家应该没听过了啊,叫索引覆盖是吧?呃,什么意思啊,大家你看啊,这里边的话呢,我们有一个叫k part2啊FROM1K part3啊,这个是一个A,那咱们的这个PART2也好,PART3也好,首先呢,你看这个位置啊,我们说能不能用上,所以呢,其实是。其实是不是不行的呀。法,那就我们单独去看的话呢,其实是不行的,为啥呢?因为我们这个联合索引呢,如果我们要用的话呢,你得考虑到呢,是不是先得用这个词段,再用这个词段,再用这个词是吧?那那但是这时候我们发现呢,你要查询的这个字段呢,也是我们这个索引中联合索引中的一部分。
27:12
啊,联合索引中的一部分啊,那怎么办呢?诶这个大家提前预知一下啊,你发现在我们这个结果里边竟然用了我们这个联合索引,诶这个呢,就是因为诶你要查询的这个字段和我们这里边外尔中的这个字段呢,它恰好属于这个联合索引,都是这个其中的一部分,诶那好了,那我们干脆呢,就整个把这个联合索引呢,我们就使用上,诶利用这个索引呢,我们实打实的去遍历一遍啊,全部遍历一遍,然后找一下呢,你这个k part的三呢是A的这样的一个场景。啊,就是这样的意思啊,那问一下你看,比如我们前面这块,你看我们再去加一个,我叫K1。啊,这个K呢,显然是不是不在这个联合的这个索引当中,那此时呢,我们再去选中,你看是不是就不理想了啊,因为呢,你就没有用具体的这个索引联合索引了,所以呢,就实打实的开始去全部的一个查找。啊,这个注意啊,那那什么叫呃索引覆盖或者叫覆盖索引呢,啊这个呢,咱们就先简单来说一说吧,哎,就是我们现在呢,你要。
28:10
查询的我们这个联合索引,咱们这时候呢,你看用到这个联合索引了是吧,我们要查询这个联合索引啊,不用回表操作就能够找到我们想要的数据,诶你看查询的这个字段和我们这个外这个字段呢,它俩是不是都在这一个缩引里边啊,就不用回表了。啊,先简单这样大家去理解就行啊,不用回表就能够找到我们要查询的数据,那我们呢,就叫做一个覆盖索引啊,咱们到这个下一章当中啊,讲这个优化的时候呢,我还会去说这个覆盖索引的啊好先这样,然后呢再往下,呃,最熟悉的全表扫描啊,这个呢,就是最直接的了啊咱们刚才是不是也说到了好几个out的场景了,那你呢,也没有有这种索引的这种场景,那你就实打实的这块呢去,哎,全部都变利一遍是吧?哎,叫全表扫描,那就是个奥的场景。好,那么这样的话呢,咱们就把这个tap呢就说了说,诶很多场景下呢,是不是都是基于有这个索引的,对吧?但是呢,不同的那种场景呢,我们这个展示的情况也不一样啊,那么结论是什么呢?呃,结论的话呢,我们看一看啊,就是有一些呢,是需要大家来注意的,咱们呢,再去这个编写搜狗L语句用explain呢去分析的时候啊,或者你找到一个慢查询了,你去去分析这个慢查询的时候呢,如果呢,大家发现我们这个呀,处在后边这几个当中。
29:24
啊,后边这几个当中,那其实呢就不太理想。啊,不太理想,哎,那么最好的话呢,我们是出现在前面这几个蓝色的当中的。这几个蓝色当中,看这里边写的说这个这是麦这个阿里巴巴这个开发手册里边提到的啊,说关于这个SQ性能的一个调目标,至少呢,我们要达到这个range级别,这个range的话呢,其实也不是特别的好啊,咱们刚才的哪个是R啊。嗯,诶,我们往下走啊,咱们刚才呢,哎,像这个这是一个范围的一个查找来走起啊,这个呢,是不是就是个润啊,就是你最起码的话,你也得得得达到这样一个级别啊,然后呢,比较糟糕的话呢,那就是这个index和这个all的这种场景了啊,最好的话呢,是能够达到我们前面这样的一个级别是最好的。
30:07
OK啊行,那这样的话,就是我们通过这个ta呢,能够看到的一些这个启示的信息,知道了我们执行相当于一个效率的一个场景。好,那么这个type呀,咱们就说到这儿啊,这个其中呢,有几个还是有难度的,大家下来的话呢,自己亲自呢去跑一跑,去测试测试啊,去想一想,然后接下来的话呢,我们看后边这两个叫possible case和这个key,那这个key的话呢,咱们说定义这个索引的时候呢,是不是也可以用这个关键词,所以呢,你可以理解成这叫index,是不是叫possible indexes是吧?那也就是说我们可能使用到的索引和真实用的索引是什么啊,这两个呢,比较简单啊,好理解。呃,那么有可能呢,我们这块呢,在一个查询语句当中啊,查看这个执行计划的时候呢,Possible case呢,是不是可能会列举出来多个对吧?那一般情况下呢,就是将我们这个where后边当中,你涉及到这个字段,只要呢,在这个字段上面,我们作用有这个索引,那它通常都会列举到这个位置上。
31:02
比如我们这个上呢,有一个索引,这个上也有一个啊针对它呢,还有一个联合索引,那都会列到这儿,那么这个K这块呢,就也称为呢叫index,表示我们真正的使用的啊这个索引是哪一个,那此时呢,就会涉到一个问题,就是说我们可能的这个呢,比如有三个,那真正用的呢,是其中的某一个,那那其实我们这个查询优化器呢,就会是不是在这三个里边去做这个比较啊,看看哪一个呢,花的这个成本呢,是最低的来注意这个我们所谓的成本最低,不一定意味着时间是最短的啊。好,那么选中其中一个的话呢,我们最终呢,就确定下来,从这个角度上来讲的话呢,就是呃,这个选择比较多呢,是一个好事还是一个不好的事呢。啊,有同学说呢,有三个女生啊追我,然后呢,这个追我的人越多越好啊,那就是多点好啊,其实呢,正好相反是吧,你多点的话呢,你是不是过滤要呃删的这个机会要多一些,那你最后只能留下来一个当你女朋友,那你删的这个机会多花的时间是不是就长一些啊。啊,也同说我挺享受这样一个状态的是吧,反正是你的事儿啊,但是我们这儿呢,不行,这液化器呢,你从这里边三个或四个里边去挑一个啊,挑的越多,那这是花的时间呢就越长啊,这个呢,其实是不是一个好事儿啊,OK,这是一个点,另外一个的话呢,就是有的时候呢,我们这个port key这块呢,你会发现呢,我们这作用在字段上,没有这个具体的索引,那这块呢,它就是一个空,一个闹,呃,那么实际的话呢,我们这个在执行当中啊,呃,这个结构有可能我还进行一个优化,那优化完以后的话呢,我们可以用上一个索引了,呃,就可能会出现这个位置是个闹,这个位置上反而是有一个具体的索引了。
32:30
啊,这个大家在一些场景下呢,稍微注意一下啊,并非说这儿呢,就是它的一个子集啊,这个要注意。好,嗯,整体来讲呢,这个不难,所以呢,我们就直接呢看这个例子啊,我例子也写的比较少,哎,这儿呢就直接啊,我们选中,其实前面这些呢,大家你也可以拿过来作为我们实际当中的一个例子啊去看,包括后边这个呢,我们讲后边字段的时候,也可以看一看这俩字段。啊,这个呢,我们选中在这里边的话呢,我们这个K呢是大于Z的,说K3呢是等于A的啊那有可能的话呢,这个上边是不是有个这个字段,那有个这个缩引,然后这个K3上呢,有这个索引,所以呢,这两个都有可能,但是真是我们用的话呢,诶发现查余液化器呢,最终呢,选择了它,而没有选择它,因为这是个范围,有可能是涉及到很多对吧,而我们这个呢,就是一个精准的等于A,虽然这不是唯一的约束吧,唯一的索引,但是呢,这个等A的情况呢,毕竟比你这种情况应该要少一些,所以我们认为这个成本要低,所以他就选择了叫诶index k3。
33:26
那就这个场景。这个大家理解是吧,啊理解啊,哎,你看这个位置,我们把它把它呢,改成是个or会是什么样子呢?来我们选中执行。好,我改成all以后的话呢,咱们前面说type是不是我说过也叫index啊,就合并了,这就相当于是个病的一个情况,那这里边这两那就都用上了。哎,就是这样一个意思啊,行,那这个我还改回去。呃,这呢叫possible case和这个K,然后就过了,然后接着咱们看下一个,这叫key length啊,这个key length的话呢,就是我们实际使用到这个索引,它的一个长度是多少。啊,长度多少这个单位呢,就是多少多少字节啊,注意是多少多少字节的意思,呃,能够帮你检查是否充分的利用上了索引,这个值呢,就是越大越好,呃当然这个值呢,所谓的越大越好的话呢,并不是单纯的说我们这一条记录是303,我们,呃另外的一个查询语句呢,它这个是二二十,呃说这个越大越好,其实还不是这个意思,是在我们这个不是你跟别人去比哈,你是跟你自己的这个去比。
34:25
啊,你跟别人比没意义,因为别人的话呢,这个所以呢,有的那个比如work差是十啊,人家work差十,你这个work差是100,那你这块呢,肯定你这块可能涉及到这个lengths呢,就要长一些,你不要跟人家比,你跟你自己比也同学那跟自己比呢,还有啥可比的,那不是一个固定值嘛,诶不是诶所以说我们这个帮我们检查这个是否充分利用上了缩银啊,它主要针对的呀,是谁呀,是我们的联合索引啊,这块我说明一下啊,主要。哎,主要针对于我们的这个叫哎联合索引啊,这个有一定的这个参考意义。
35:01
来参考意义,好,那我们来具体看一下,比如看这个说explain select from105啊这个呢,我们走一下,走一下这个呢,是不是这个主啊,呃,这个主键的话呢,我们这个值怎么算出来这个是个,呃在啊这主键是吧,怎么算出来这个是四呢?呃,你看这儿啊,我们这ID是个int,这个int的话呢,本身是不是占四个字节。啊,然后呢,占四个字节,它也非空是吧,它其实也是个定长的哈,哎,就是四个字节,那这就是个四,那就完事啊,那么这个K2的话呢,我们看它是多少啊走起。大家看到这个值呢,是不是个五啊,那么K2的话在这说呢,诶这不跟那个ID一样,应该也是四个字节吗?大家你注意我们这个K2的话呢,它上面是有一个unique啊,相当于是一个唯一性约束,但是没有说非空啊,它有可能是空的,那么加上这个空呢,是占一个字节,所以它呢就是五个字。啊,就这个意思,好,接着再往下看,我们这个K1是A啊走起这个呢,你看哇,这个303说这个303跟我们这个比,这个呢是一个五,说越大越好,注意不是这个意思啊,这个你303跟我们这个五的话呢,其实就没有什么可比性啊,那为什么你是303呢?诶大家你看我们这个K1的话呢,它是不是叫窝差是100,而我们。
36:14
而我们呢,在这个UTF8当中啊,UTF8当中,咱们的一个字符是不是占三个字节,所以我是不是应该乘个三啊,乘以300以后呢,是不是300,首先这应该是300啊,注意300的情况下呢,我们这个K1呢,注意它呢,是不是也可能是一个空的情况,所以说得加个一啊。啊,那还有可能,它是不是还有可能呢,它就是一个是不是一个变长的一个类型啊,啊变长的话呢,我们还得需要两个字节呢,去记录一下它这个具体的实际长度是多少,这加完以后呢,是不是就303了。哎,所以就是我们这个值。啊,这叫303好,接着再看这啊下边这块呢,我们再比较呢,它就有意义了。我们针对这个联合索引,你看我这写的是个A,来走起。这个呢也是303,跟我们上面这个道理是一样的啊,这个它也是一个100啊,是一个误差类型的,就是它乘以三再加上一个呃,空的情况,再加上两个呢变长是吧?来记住这个这个变长这个字段的实际的这个长度一共呢是303没问题,好在我们使用啊,你注意看啊,诶我这样给你截一下。
37:17
哎,这么着是吧,在这在我们使用了这个叫呃,联合索引的情况下呢,我们这个长度是303,然后你再看我们这个。诶,我把这个呢,选中了去执行,你会发现呢,我们也使用了是不是这个联合索引啊,那么但是人家这个值呢是606,我说这个606就比这个303要好啊,因为呢,你看我们构建的这个联合索引的时候呢,哎,这是我们这个B加数对吧,那这里边呢,是不是就有那K1啊,诶k partd1 k partd2 k partd3,然后再加我们这个主键是不是这样的几个字段啊,那如果说你上边这个情况呢,只考虑了这个K1了,而我们这个呢,还考虑这个K2的情况呢,是不是这个考虑的数据就更精准一些啊,哎更往下延伸就是你加载的页呢,肯定就会更少一些嘛。啊,那它是606,那就相当于是它也是300加一起不就606嘛,那这个要更好一些了啊,那如果说再按了一下K帕的三。
38:07
这个我们再重新复制一份CTRLC啊。啊,我在这儿再加一个。说这个and啊,这个大家应该都能猜出来了,K part3,然后呢,等于我们来个C。哎,那此时呢,哎,选中以后呢,一直行,这个是不是就成了909了。哎,没问题好,哎那这个值呢,是不是越大越好,哎针对的主要是我们这个叫,哎联合查询来讲的啊,联合索引来讲的好,这个过了,那么这个时候呢,我们这个一呢。来,大家走起看一下。啊,这样呢,你会发现呢,他根本都没有使用上我们的索引。对吧。哎,没有使用上我们这个缩啊,这个主要原因呢,就是因为我们这个呢,就是下一章要讲的叫最左前缀原则啊,其实大家也很好理解,就我们这个B加数呢,在构建的时候呢,你优先考就是先要考虑是我们这个k part的一这个字段,这两个字段都不考虑,你上来就来这个字段,我们这个B加数呢,是不是肯定这个二级索引的这个B加数你肯定用不上啊。
39:04
哎,所以我们就哎没有有具体的K了,哎,这也就没有意义了啊好的。然后下边这块呢,我给大家列举出来的就是一些练习了啊,就是大家呢,你得知道我们这个key练呢,它是怎么计算的啊,哎,Whatar whatar这种类型,这少一个A了啊。卧差这种类型,这是十允许为no,呃,那就是十乘以这个,诶不同的这个字符集啊,它占用的这个字节数呢,是不一样的了,你要UTL8,那就是十乘以三加上一个闹,加上两个变长的这个字段,这样呢不允许为闹,那就把这个一个nu的这个就去掉了,哎,那叉类型的话呢,它是一个定长的,所以你就十乘以啊,根据字数集相关啊运行为道那加个一。就完了,哎,它就不用加两个变长字段了,因为它是个固定长度的,对吧,哎,就这意思啊行,那这个呢,我们就说到这儿。啊,关于我们这里边儿提到了一个叫possible case和这个key啊是什么。
我来说两句