00:00
好,那以上呢,就是咱们说到的这个MYSQL服务器的一个逻辑架构的这三层,那三层里边呢,分别具有哪些组件二呢,我们说完了,然后接下来的话呢,我们来说第二问题啊,就是刚开始我们在画这个图的时候呢,我是不是标了一个1234,这1234的话呢,就是我们下边呢,具体给大家展开呢,要说的这个事儿,那刚才呢,大家可能听的呢,诶这个比较泛泛是吧,我们具体呢来展开去说明。那这儿呢,我画了一个图,这个图的话呢,大家最好能够去记一下啊,或者呢,自己拿一张纸和笔呢,能够画一画,能够画出来呢,那是最好的啊,这儿呢,就展示了整个我们SQ的一个执行的流程。那么在面试当中啊,实际上也有可能会问到这样的一些结构啊,那么这个结构呢,除了面试对我们有意义之外呢,对我们后续的学习有什么帮助呢?来注意咱们后续的话呢,是不是要讲到这个索引啊,那索引的话呢,它底层会用到这个B加数,那B加数的话呢,结合我们这个逻辑架构啊,其实都是算偏底层的内容,然后基于这两个点,我们就可以呢,去谈后续的,比如索引的一个具体的使用,那什么样的场景下,什么样的字段我们适合去加索引对吧?然后呢,包括性能分析工具啊等等,就是上层的这些优化的问题,都是基于我们现在要讲的这个底层啊,比如说你说到这个优化,社会优化对吧,那这个社会优化的话呢,到底底层是在哪个结构负责的呀?诶我们是不是就提到这个优化器了,那优化器呢,到底处于我们整个逻辑架构的哪一个环节呢?诶这是不是就是我们对应的这个逻辑架构啊。
01:28
OK,所以说呢,这儿呢是有意义的啊,大家把这个图要记一下,呃,整体上呢来看我们客户端的话呢,首先呃,这个进到我们这个数据库服务器之后呢,这块呢,提到一个叫查询缓存,对吧?诶这呢也是我们要讲的第一个环节叫查询缓存,那么如果命中了这个查询缓存的话呢,我们就直接呢,把这个诶KY6的这个VALUE6呢就返回了,就相当于这个查询结果呢,直接返回给客户端,后续呢就都不用做了,那如果说没有命中啊,当然这里边我们要强调一点,命中率呢,实际很低,那没有命中的话呢,我们就进到这个解析解析器,这解析器的话呢,需要进行词法解析,语法解析,生成一个解析数,解析数是吧,然后这个解析数的话呢,呃,相当于就决定了我们这个SQ呢,你到底要干什么?
02:11
然后呢,接着走我们这个这个查询优化器,这个查询优化器呢,相当于是进行一个SQL的优化啊,这个呢,就是我们所说的SQL优化呢,主要是针对这个优化器来讲的,然后它会生成一个执行的计划,就是实实在在的我们底层呢,到底该怎么去执行你这个circleq了啊,这叫执行计划了,然后这个执行计划呢,需要呢,呃,调用我们的这个执行引擎啊,他面对的其实是我们这个呃执行引擎这个API,然后具体的呃对接的就是具体的一些这个执行引擎了啊这个API呢,只是一些接口,那具体呢,需要有这个具体的直行引擎呢,来去体现。然后呢,去查询我们底层的这个文件系统,查完以后呢,把这个结果返回的同时呢,是不是还把结果放到我们这个查询缓存当中,对吧?这个就是我们整体上这样一个流程啊,又捞到了一遍,然后下边呢,我们来看这个第一个环节叫做查询缓存,相当于呢,我们一上来经过这个连接以后,我们首先呢,去查询缓存当中去找一下是不是啊,能够命中我们当前的这个SQL语句。
03:10
啊,这里边还提到一个点,就是说有这个叫query catch tap,那需要呢,看一下这个参数呢,我们是不是打开了,打开以后呢,相当于我们才走这个查询缓存啊,这个一会儿再说啊呃,那查询缓存顾名思义呢,就是我们把这个执行的这个SQL语句呢,给它缓存起来,当你要是再次执行同样一条SQL语句的时候呢,那我们是不是诶这个缓存的把它呢作为这个K了是吧,那Y列的话呢,就是你执行的这个结果啊,你要是再次来一条SQL跟这个是完全一样的,我们现在就是命中了,直接把这个Y就返回了,这是它的这个好处。但是在这个8.0当中呢,把这个给抛弃掉了。诶给他抛弃掉了对吧,那么为什么呢?那这就我下边写的,在大多数情况下呢,查询缓存呢,就是一个鸡肋啊,所以说在8.0当中啊,直接呢就给它干掉了,那为什么呢?主要原因就是因为它这个命中率啊太低了啊,你看这里边我写到的就是我们写的两个这个查询语句啊,必须要求呢,是完全一样的啊,我举一个简单的例子,你比如说我这里边写一个啊select,咱们叫。
04:15
Employee ID啊,比如说叫last name from啊,我写成个大写吧,那employees这个表。Employees列表,然后where。那where什么呢?我们叫那employee ID,比如等于101,这呢是我们的一条SQ语句对吧?那么这条SQL语句呢,我们执行第一次执行的话呢,你没有这个查询缓存了,然后执行完以后呢,会把它呢这个circle其实呢,也可以理解成它就是这个字符串了,把它呢作为这个key啊,然后对应的这个value呢,就是你查询出来这个结果,诶给它这个这个缓存一下,对吧,那就是对应我们这个是不是employ ID和这个last name呢?诶作为这个呢,缓存起来,然后再下一次的话呢,诶这个注意一下,如果我这个位置呢,你看比如我加了一个空格。
05:03
你会说呢,哎,这个SQL语句,这不是跟我们刚才那个SQ语句是一样的吗?哎,注意是不一样了,因为你看这个字符串跟我们没加空格这个字符串你讲长度都不一样了呀,所以呢,这个就不认为是命中了啊,进而的话呢,就是你这个S后语句呢,查的时候呢,它还得是走我们这个解析器和优化器。啊,所以我们刚才呢,缓存的这个没有啊,这块这个空格呢,其实就意义不大了啊,所以说我们匹配的时候呢,就叫鲁棒性呢,就大大降低了。啊,所以说这个就那就是很鸡肋是吧?啊这呢是我们说的一种场景,另外一种场景呢,就是涉及到了我们有的时候呢,在查询当中啊,那当然也不只是查询了,我们可能会涉及到一些函数的调用,对吧?那比如说呢,我们这里边调用这个函数呢,诶叫no,诶你想想我们第一次的话呢,这里边出现了一个no,那我们要第二次再查询的时候,你按说呢,两个SQ语句呢,可能完全一样,但是这个闹呢,所代表的这个时间啊,它是不是就变了呀。你今天执行呢,跟明天执行呢,调到这个闹出来的结果肯定不一样,所以呢,这时候我们也没有必要呢,是不是针对于这样的情况呢,进行缓存呢,对吧?诶这呢相当于也是一个返利啊,那还有一种情况,那这块还有就是我们这个缓存的话呢,它也有这个缓存失效的一个,这个时候那你比如说我们这个操作的话呢,我们查询出来的这条记录呢,是没有问题的,你把它给缓存了,然后呢,咱们紧接的话呢,做了一个delete的一个操作。
06:25
那我呢,把这条呃,Employeed呢是101的这个人呢,给他删了啊,正常来讲呢,你要再查呢,是不是就查不到了啊,当然现在呢,你要是还是从那个查询缓存里边去找,相当于还找到了,那就相当于它就是一个错误情况,对吧?诶所以说呢,我们此时的话呢,想表达的意思就是说,诶我们这个数据呢,如果做过这个修改的话呢,导致呢,你再从查询缓存里边去调呢,那就不准确了。那那我们要想这个,呃,还想使用这个产业缓存呢,那你必须得呃应用在那个是不是使用率非常低的这个表当中,那这个修改非常低的这种表当中,哎,我们通常呢,称为它的叫静态表啊,在静态表当中呢,呃,你缓存呢,可能还有一定的意义。
07:05
啊,这是我们说这个概念,好这个事儿呢,就说清楚啊,为什么说它鸡肋,好下一个问题的话呢,就是即使注意,即使咱们在这个5.7当中啊呃,咱们这个默认情况下呢,其实也得需要呢,给它做一个开启。啊,也得需要给它做个开启,那这个值呢,如果是零,那表示的它是一个关闭状态,一呢表示这个开启状态,然后二呢叫demand的是吧?那那这块我们首先呢,你可以查询一下,这个叫query type,它的一个值是多少,那我们回过来,哎,这个160呢,我们对应的是不是这5.7对吧?诶首先呢,我做一个登录啊,这个MY。哎,Root用户啊,ABC123这个密码是吧?行,那这时候我们可以呢叫啊variables。啊,Like是吧,然后这个我们加上这个百分号吧。Aqui。嗯,Catch。Tap是吧?
08:00
啊,这个其实加不加百分号都行了啊,查询一下这时候你会发现呢,这个值呢,是不是就是个off啊,也就是说默认情况下呢,我们这个呢,查询缓存呢,其实也是一个关闭的情况,嗯,如果呢,你想把它打开,那我们可以在配置文件当中呢,给它设置成啊一个比如说一,那就表示是开启的状态,那开启的话呢,我们发现它也会有一些问题,可能命中率也不高是吧?那怎么办呢?哎,我们这时候呢,说还有一个人性化的操作就是二,大家把这个值呢,可以设置成是这个二,二呢叫做按需使用。那怎么叫按需使用呢?举个例子,比如说呢,你看我这样的写这个circle语句啊,我这样写的口语句select星,From test where ID等于五,中间呢,我加了一个叫circle catch,那这个呢,就意味着我们先要过一下这个分号,好像写的不对啊,应该是咱们这个英文格式下的是吧?如果呢,你加上了一个叫四扣cash,那这时候我们就先要到这个查询缓存里边呢,去确认一下,看看是不是有这个缓存存在。啊,那这个呢,就是相当于使用了还询缓存,那怎么叫不使用呢,就我们在这个位置呢,咱们写一个叫circle no catch,那这时候呢,我们这个circleq语句呢,即使你这个,哎这就不能说要开着了哈,因为咱们这就按需分配啊,就是这样的一个操作呢,就意味着我们就不过这个查询缓存了,直接呢就找这个解析器。
09:15
啊,写这个没有弄的呢,就他需要过一下这个查询缓存。啊,就是我们说的这样一个概念,好,那这呢,我们能看到是5.7当中的这样的一个场景,对吧,那同样的这样的一套操作啊,我把它复制一下,咱们放到这个8.0当中,哎,你看这块我们拿过来它走起。啊,你会发现呢,此时你看我们是一个M系列状态,现在就没有查到啊,因为我们已经没有这样的一个参数了。好,这个是我们说的这个事儿,然后另外一个的话呢,我们在5.7当中,如果你使用了这个查询缓存呢,我们定期呢,你也可以去执行这样一个操作,来查看一下我们这个查询缓存的一个命中率啊,当然了还有其他一些具体的参数来,我们拿过来在8.0当中呢,你看我们粘过来以后呢,一回车是不是还是一个空的,对吧,然后我们换到这个160这块,哎,我们这块呢去执行。
10:00
好这块呢,我们执行的时候呢,大家就会看到一些结果,这个呢,对应的Q大家理解成了就是query的意思是吧,查询的缓存啊,就是这样一个意思。来这块呢,我们给大家稍微啊说明一下这个参数的,呃意思啊,这个呢,就是查询缓存它的free blocks啊,就是相当于空闲的这个blocks这个空间啊,这个值的话呢,如果越大啊,空闲的越大呢,其实就意味着我们这个查询缓存这个缓存当中啊,它这个碎片呢,就比较多啊,那么可能在一定的时间之后呢,它会进行一个碎片的整理啊,那这块呢,表示就总共的这个block的这个大小,OK,然后第二的话呢,就是free memory存在一个大小,对吧,那这个值越大的话呢,相当于我们这个空间呢,呃,相当于目前利用率呢越低。呃,它跟谁相关呢?我们看到诶看下边这个吧,诶诶它跟这个吧,是吧,这个呢,是不是叫low memory,呃它呢是什么意思啊?呃,Memory就是相当于我们这个内存呢,就不够了啊,就是说有多少条这个查询呢,是因为内存不足而被移除掉了啊如果这个数比较大的话呢,嗯,当于我们这个产余缓存呢,咱们不是说它也有内存大小对吧?那这个位置呢,诶我们通过它呢能够查看,如果说我们这个数值比较大,相当于呢这个内存不足而导致的我们被诶从这个查余缓存中移除的这个。
11:18
呃,这个SQ的这个多少,这个值越大的话呢,就意味我们内存呢,可能就不够了,呃,适当的你需要去增加这个查询缓存的这个内存大小OK。嗯,这个的话呢,叫query啊,In cash啊,它表示的意思的话,就是我们当前缓存当中缓存的一个查询的数量。啊,它是记录这个查缓存的一个查询的数量,这个note呢,诶这个值是一个三是吧,它呢,就是我们这个query的设置啊,因为这个设置呢,而没有被诶缓存的这个查询的数量。呃,上边这个还有一个hits啊,Hits呢,它表示的就是命中的一个情况,这个值越高的话呢,就意味着你当前这个呃越靠谱是吧?诶产品缓存呢,相当于这个利用率呢就越高,这个呢叫inserts啊,它表达的意思呢,就是说诶我们这个去查询缓存里边去找结果呢,是不是没有命中啊,没有命中的话呢,你一顿解析啊,优化啊,最终的回来以后是不是还要把这个呃。
12:14
结果啊TY6啊,再缓存到我们这个产品缓存里边,那这呢,它表达意思就是你添加到这个缓存里边的这个数量,这个数要越高的话呢,是不是体现的就是你这个命中的率就越低吧。啊,命中率越低啊,这个也高呢,就是比命中率就越高啊行这块呢,大家整体上做一个了解,其实就可以了啊呃,定期的你可以查一看一下这个缓查询缓存呢,相当于它的使用情况啊,靠谱还是不靠谱?好,第二个过程呢,我们称为呢叫解析器啊,解析器在解析器当中呢,对SQ语句呢,进行语法分析和语义的一个分析啊,就是你命中了啊,那就直接走了,没有命中啊,这时候呢,我们就要进入这个叫解析器啊,也可以呢,叫做分析器啊都可以。行,那这里边呢,主要有两个环节啊,一个呢叫做词法分析,一个呢叫做语法分析,词法分析呢,就是比如说我们查询一个呃,这样一个select的一个操作吧,它呢就分析出来你哪些呢是关键字啊,这个select是关键字,然后呢,这个test呢是一个表名,这个ID呢是一个字段名啊这叫词法的一个分析,然后接下来呢,是一个语法的分析,那有可能这些词呢写的都对,但是攒在一起呢,这语法呢是不满足的。
13:24
那举个例子,你比如说咱们以前也说过啊,你看我这块呢,去select,比如说叫嗯。这样吧,Depart。Department ID。嗯,然后呢,这个叫ID,这个employees。哎,这个别玩了,直接我们group啊group呢,这个位置我写的叫department ID,哎,我直接分号就收紧了,这时候呢,显然我们这个语句呢,写的是不是有问题的。因为这个我们再加一个它啊,还avg的一个,比如叫salary。诶,我们这里边呢,想查询各个部门当中不同工种的一个平均工资,然后格外里边呢,你只写了底盘麦地,没有写赵白地啊,那这个呢,其实就是一个语法上的一个错误,对吧?那你说从这个词上来分析的话呢,是没问题的,但是我们这个语法上来分析它就错了,那在此时的话呢,相当于是它就会,诶报这个错误信息说you have one error呢,In your circle这样的一个语法当中,哎,这是由这呢来决定的。
14:21
好,那如果说呢,你这个circle呢,写的是没有问题的,最终呢,它会帮我们生成这样的一个叫语法数,你看这是select,我想查询username和is mail from,我们这个叫user in for这个一个表,然后where啊,Age呢是大于20的啊,然后这个level的话呢,是大于五的啊,这个一等一是吧,这样的一个场景。好,这个呢,就是我们说生成这个语法数啊,下边这个图呢,就是具体呢,体现了一个叫分析机,哎,这个分析机呢,就是针对我们上面这个语法的情况呢,呃,独立的分析模块组成的,相当于一个list,然后循环的方式呢,来去进行一个分析啊这个大家了解下就行好过了。
15:01
这个我们经过这个解析器以后啊,或者叫分析器以后呢,咱们是不是就知道你这个circle到底是要做什么的了。想想是吧。诶,他就知道我们circleq呢,到底是要做什么了,然后呢,我们进入这个叫优化期,这个优化器呢,它来决定的是什么呢?就是我们这个SCO呢,怎么样执行效果是最好的啊效果这个词不准确啊,就是这个,呃,准确来说呢,应该叫花的时间比较少,成本比较低,对吧?那这就我们这个优化器呢,他要做这个事。那比如说我们写的这个搜后语句,知道你要做什么了,那到底我们执行的时候呢,是进行一个全面的一个检索呀,还是使用这个索引来进行检索呀,当然使用上索引效果会很好,对吧,那说那就用索引呗,但是有可能我们这个索引呢,针对你这个字段呢,上面有好几个索引,那到底我们应该用哪一个呢?那这呢也需要做一个选择,对吧,那这呢就是我们优化器呢,它要决定的事情。嗯,说到一条查询可以有很多种执行方式啊,最后执行结果呢,反馈结果呢是相同的,那液化器的作用呢,就是选择其中最好的一个执行计划。
16:07
啊,最终呢,优化器执行完以后呢,也会生成一个执行计划。啊,诶这个我这没写啊,诶后边这块呢,它会生成一个执行计划,就是我们到底该如何去执行咱们当前这个circle啊,诶这里边举个例子,你比如说其from test1是个表,T2是个表啊,关联呢是我们这个ID啊,它俩里边都有ID啊连接条件,然后where呢是T1里边的name呢叫张伟啊,T2的name呢叫MY高级课程啊,你比如说我们这呢,是这个学生的这个名字是吧,这个呢是他这个对应的这个课程,然后我们这儿呢,是相当于是做的一个查询。那查询的时候呢,我们是先从太子一里边找到张伟啊,张伟这个名呢,在中国比较普通啊,能拉出来一个连拿出个营都有可能是吧,都叫张伟的,那我们是先找到张伟,然后根据这个字段呢,找T2啊,通过ID这个字段去连接test,呃,这个通过这个name字段呢,我们去找到这个T2里边这个内幕,它呢,还是我们先定位这个麦高级课程,然后呢,再通过这个连接条件呢,再找到我们test s里边这个内幕找张伟呢。
17:09
就是谁来发起主动的连接啊,就我们称为它叫驱动表和被驱动表,到底是谁这个呢,都是由我们这个优化器呢来进行决策的。啊,这个后续的时候,我们讲这个SQ查询的时候啊,打开咱们这个课件啊,在这块的时候呢,我们会讲到这个SQ的优化和查询的优化啊,详细来展开咱们在这个具体应用的层面的一些具体的措施啊这呢还是一些理论的啊。然后在这个查询优化器当中啊,咱们具体的可以分成呢,叫逻辑查询的优化和物理查询的优化啊,那对应的这个课件这块呢,其实诶,我也是通过这样的方式来呃呈现的啊啊你看这呢,我也提到了啊,具体呢,就分成叫物理查询优化和逻辑的查询优化是吧,那这两个优化呢,主要针对的点呢,还是有一些区别的,你比如说我们所谓的叫呃,叫什么逻辑查询优化啊逻辑嘛啊,那这时候我们就相当于是从这个语法上来讲,你这个写法,比如用了一个子查询,所以呢,能不能改成是一个多表连接呢?啊有时候是可以的,那改成多表连接比你子查询呢,是不是就要好一些啊啊相当于使用这个SQ就要等价变换这个方式,就逻辑上做了一个调整,那什么叫物理查询优化呢?哎,就是我们可以使用上物理上的,比如说索引啊表连接的方式,哎这样的技术呢,咱们进行优化,哎这个称为呢,叫物理查询的优化。
18:26
啊,这个到时候呢,具体的这些策略啊,等等我们到时候呢再去说OK。好,再回来这呢,就是我们说的这个叫呃,优化器,好,那优化器的话呢,最终它会生成一个执行计划,但是呢,此时我们并没有真正的去执行,它还只是一个计划是吧?哎,那具体要执行了,这时候我们称为它叫执行器。啊叫执行器啊,这不你看交出一个执行计划给了我们这个执行器了,执行器的话呢,现在就要开始去执行,这时候呢,需要判断一下呢,你是不是具备相关的权限,没有权限就报错了啊,有权限啊,有权限就执行,执行完以后呢,以后的话呢,还把这个,呃,相应的这个结果呢,是不是在放到我们这个查询缓存当中,对吧?哎,这个事儿好,那么具体这个执行的时候的话呢,我们需要呢,调用这个存储引擎这个API了啊,其实准确来说呢,是调用存储引擎API,它实际上是一些接口,具体体现的话呢,就是我们所谓的这种插拔式的这个存储引擎啊,你可以用in DB,也可以用这个MYS,当然具体呢用哪个,我们得看它们各自的特征特点,对吧?
19:28
这个呢,我们下一章当中啊,具体展开再说,那我们调用具体这个存储引擎,他们呢,再去呢,调我们底层这个文件系统啊,实现呢,我们对这个呃,真正这个呃数据的一个查询啊,或者其他的这个增删改这样的这个操作啊OK。哎,这呢,还举了一个例子。比如我们上面查那个表,找这ID这个字段是吧,那我们这个调用inno DB存储引擎的这个接口,然后呢,找我们这表中的第一行数据,看它是不是一啊,如果不是呢,就跳过啊,是的话呢,我们把它先暂存到这个结果集当中,接着呢去找它的下一行,意思呢去找找找找找啊,一直找到最后把这个所有能满足这个ID是一的这个数据呢,我们把它返回给咱们的客户端。
20:08
那如果说我们这里边儿有索引的话呢,诶咱们刚才这块呢,像是一个全表的一个检索,全文检索是吧?诶一行一行的这个都检索了,然后呢,如果你要是有索引的话呢,我们可以进行索引的一个检索,效率会更高一些,但是整体的执行逻辑呢差不多。啊,具体呢,怎么去执行,那我们讲到,所以呢,B加数以后呢,咱们再说。好,那整体上来看的话呢,我们这个色Q的一个执行流程就是这样子的啊总结了大家需要记一记啊,这个色控呢,怎么执行呢?诶色控的话呢,先要经过这个叫分析器啊,进行一个语法分析,语义的分析器,然后呢生成语法数,然后呢,在优化器层面呢,进行逻辑的优化和物理的优化,生成一个执行计化,执行计划呢,由这个执行器呢进行执行啊出来这个具体的结果。啊,这就是我们整个这样的一个环节。啊,整个这个环节,咱们在讲这个上篇的时候呢,当时咱们是不是说过这个circle的一个编写的一个顺序和它执行的一个顺序,对吧?呃,当时呢,我们是从这个SQL角度来分析的,而这里呢,我们是以整个执行过程当中,MYSQL数据库服务器内部的一个执行的机制。
21:13
好,那么我整个讲的这个过程呢,大家最好自己呢,能够画画图,然后用自己的语言呢描述出来啊,那么至少在面试当中啊,这个问题呢,就可以很轻松的给他解决出来,而这个呢,也对于咱们后期学习索引讲到优化啊,是起到一个帮助作用的。
我来说两句