00:00
好,同学们,那么接下来的话呢,咱们就开始讲解这一章的重点,那就是我们这个页的这个内部结构,还有我们这个行格式,OK,首先呢,我们来看这个页,说页啊,如果按照类型进行划分的话呢,我们可以分成呢,叫做数据页,系统页,安度页和事务数据页,当然这呢只说了四个,其实还有很多的类型啊,很多的类型,那其中这个数据页的话呢,指的就是我们B数的这个节点,那当然呢,这个节点呢,是不是既包括我们所谓的叶子节点,也包括呢它的这个非叶子节点啊。啊,比如我们这呢,是一个根的话呢,这就叫这就叫扉页的节点,这叫叫页的节点,对吧?那如果你是一个居促索引的话呢,我们放的就是一条条的用户度记录,咱们叫数据页了,那么上面这个目录项构成的这个页呢,我们起个名叫目录页啊,其实呢,它也叫这个数据页啊,就都属于我们这样一个概念好了,那么不管你是哪种页啊,只要是页啊,咱们默认的都是16KB的大小,它们的这个空间的话呢,被划分成七个部分。这七个部分呢,就是我这里边列出来的这七个部分。
01:02
啊,有同学说老师这七个部分用不用去背啊,用不用去记啊,说这个七个部分还挺多的是吧,那那其实的话呢,刚开始大家可能不用去记,不用去背啊,当你这块熟悉它这个结构以后的话呢,基本上你也能够说出来都有哪几个部分了啊,比如现在你让我去默写,那肯定是能写出来的,对吧。哎,OK,行,那我们这块呢,来看一下这七个部分呢,分别是什么,第一个呢,我们叫fairer,那自然而然叫文件头对吧,然后第二呢,叫做配置ER叫做页头,哎,下边呢叫下边这是两个。啊,下边这两个呢,我们相当于给它呢,就可以合一起了,诶就可以合一起了,这个呢叫啊,这个呢叫啊supreme,分别对应的呢,这个翻译过来叫下学界,这叫上阙界,其实呢,就是我们当前这个页中的最小记录和最大记录啊,最小记录和最大记录,这是两条记录啊,就合在一起构成这一项了。再下边这个呢,叫做user record啊,我们所谓的叫用户记录。咱们页里边呢,不是要放数据嘛,你要是页的节点呢,就是放真正的用户的一条记录了,你要是这个扉页的节点呢,就是放那个目录项的啊,都是这个用户记录,那由于呢,你这个页中放的用户记录呢,多少不确定,所以我们这个大小呢就也不确定了。
02:11
Free space啊,那就空闲空间呗,那你要一开始没有这个用户记录的话呢,那这个空闲空间就很大,那如果说呢,随着这个用户记录越来越多,空闲空间呢,就越来越小,小到了极限就是这个没有空间空间了,你要再插入一条用户记录,是不是就得再页分裂一下,开辟一个新的页了,对吧,所以呢,这个空间呢,他也不确定。下面这个呢,叫做配置director,那我们前面不也提到过说叫页目录嘛,那指的就是它那针对于我们这个用户记录啊,我们去生成这个页目录,所以说这个页目录中这个项的多少直接跟我们用户记录呢有关系,所以目前呢,它也是不确定的。然后最后一个呢,叫做file trailer,就是我们叫文件尾啊,文件尾啊校验页啊,是否完整作用的OK,那么接下来的话呢,我们就开始来讲解这七个部分,那这七个部分讲解的话呢,我呢就把它呢重新的组合了一下顺序啊,组合顺序的目的呢,是为了大家更好的去理解我们这七个部分。
03:08
我是这样组合的,首先呢,这个叫文件头,文件头和文件尾我是放在一起来讲解的啊,因为他们里边呢,有两个字段呢,呃,整体合在一起啊,构成的作用是一样的,所以我们就合在一起了啊,这是我们第一部分来讲解的,第二部分讲解的话呢,我们是来讲这三个结构。这三个结构里边呢,其实主要说的应该就是这两个了,对吧,那空间空间呢很好理解,就是你一开始没有记录的话呢,空间就大啊,随着这个记录越来越多,这个空间空间就小了,所以这是最好理解的,那么上面这两个的话呢,就提到了最小记录,最大记录,还有我们这个用户记录啊,这个都算是记录吧,所以我们把这三个呢合在一起,诶这是我们讲的这个第二个部分,然后第三个部分呢,就涉及到我们剩下这两个,一个呢叫做配置header,一个呢叫配置directory啊,这两个呢,我们作为这个第三部分呢来讲解。应该说呀,这一章呢,整理呢,花了我的这个时间是比较多的啊,因为咱们日常呢,在呃使用数据库的时候呢,其实基本上不用看的这么细啊,不用看的这么细,我们更多的是在这个应用的这个层面呢,去谈这个,诶比如说索引优化等等的这个点的,对吧?呃,当然呢,我们说还有必要呢,给大家去讲解一下,既然我们想把这个MYSQ呢,整的更加的清晰透彻一些,那我们这块呢,需要了解一下它底层的这个结构啊,对于我们调用呢,其实也是很有帮助的啊,更接地气啊,就好比是呢,诶我们回头呢,再看到一个具体的优化的一个方案的时候,除了我们可以拿真实的数据呢去做测试之外呢,咱们实际上还可以通过理论的方式进行一个分析和剖析,对吧,那这呢就更接地气了啊,就感觉自己好像就更牛了是吧?啊,当然了,更牛的人呢,其实是设计我们这个页结构的,那才是最优秀的人,对吧,OK啊。
04:47
行,那这呢,我们就来说一说这里边儿的这几个部分了。那咱们刚才提到了,说先来讲一下的话呢,就是这个fair和fair trailer啊,这个头很尾的这个部分,好,那么要讲解的话呢,咱们就可以按照这个markdown的这个顺序的往下去讲解这个课件呢,其实我写的还是比较细致的啊,花的时间比较多的啊,大家可以来一波666吧。
05:06
啊,这个你看似我们这一章呢,咱们讲的时间可能不一定是最多的,但是这一章呢,花的时间确实是比较多的,OK。呃,还是这个道理啊,为了大家更好的去理解这一张啊,因为大家的时间呢也很宝贵是吧?啊,那怎么办呢,我呢,又重新的组合了一下啊,画了一个思维导图,因为讲这种内容的时候呢,很容易的,是不是就陷进去了?诶,再回过来很容易的就陷进去了啊,然后里边呢,又包含什么,里边又包含什么,里边又包含什么,这个讲着讲着呢,进去之后出不来了啊,一出来不知道回到第几层了,那思维导图的好处呢,就是能够非常清晰的告诉大家整体的一个脉络是什么,所以呢,我又重画了一个思维导图啊,就是为了让大家能够更好的去理解我们这个图啊。哎,这个我觉得大家值得来一波666啊。好了,那咱们就不多说别的了,咱们就来看一下这个year的这个内部结构啊,刚才呢,提到了是不是有这还七个部分,OK,那我们就先来说一下,这叫fair了。
06:06
哎,来说一这个file header,这个fair hier呢,它是占38个字节,它里边呢,又分成了这么多项啊,所以说呢,你看这个麻烦就麻烦在这儿了,它里边呢,又分了这么多项,这么多项呢,每个有对应的大小,你把它加一起呢,就是我们这个38字节啊,这个我就不用去加了啊啊这有点无聊了,行,那么这里边这些项当中啊,我们挑出来几个重点呢,给大家呢去谈一谈,那首先呢,我们来看这个。这个呢,叫fair of that。诶,它是,呃,这个先这块说一下吧,整个我们这个叫文件头,它的作用是什么呢?它是就是来描述我们页的这个通用信息的啊,你看这还提到叫各种页是吧的通用信息,比如说页的编号,这个上一页下一页是谁啊,这个都是由这个fairer呢来做的。啊,由他来做的行,那我们一个一个来看一下啊,第一个呢,叫做file page of set,它呢就是来记录咱们这个页的一个编号的说呢,我们给每个页呢,都记录单独一个页号。
07:02
啊,然后呢,通过这些号呢,来唯一的定位我们当前这个页对吧?啊有点就像这一条记录中的这个主键一样,那一说到这儿的话呢,大家其实应该就很清楚了,咱们在前面讲这个毕加树这个结构的时候,啊,咱们上一章呢,相当于是直接就用了,这一章呢,我们相当于在讲它底层具体的这个结构细节,这呢就是一颗,呃,毕加树准确的说呢,应该是一个巨簇索引,对吧?呃,因为这个叶子叶放的是我们真实的一条条的记录了。那么咱们这个页呢,你看是不是都有一个页号啊,哎,那这个页号的话呢,就是咱们刚才看到的就是这个啊字段给我们去表达的啊,第二块呢,叫做呃,File page tap,一说到tap呢,不就是类型的意思吗?那我们这呢,相当于就是通过不同的这个值来表达咱们当前这个页的类型。啊,你比如说我们最后这个值的表达类型呢,叫file配置index,那那直译过来呢,就是叫索引页,那其实就是我们所谓的这个叫数据页,就是B加数中的这个叶子节点啊,非叶子节点啊,这时候呢,就叫做数据页,还有其他的,你比如说我们这个值表达的就叫做安度日志,这个安度日志呢,咱们后边讲事物的时候呢,会提到来用于我们整个事物的一个回滚作用的啊,来体现我们整个的这样的一个原子性的这样一个特征,对吧。
08:14
那么还有呢,叫file page啊,这叫系统页啊,OK,这个呢,我就不多在这块去介绍了,就是文件头表达你当前页的类型。下一个啊,File和file page next啊,上一页下一页是谁啊,这个呢,实际上大家也很清楚了,一看名字就知道,我们说页跟页之间呢,是双页列表,那这个双页列表这个呃,所谓的字段是谁来衡量的,就是我们文件头当中的啊,这样的两个字段呢来衡量的。啊来进行这个表达的,OK,那能够使得呢,我们这个叶跟叶之间啊,虽然物理上呢不连续,但是呢,通过双向链表达到逻辑上是一个连续的效果,OK。啊,就是他俩,然后再往下,哎,再往下呢,这两个字段呢,呃,就稍微的难理解一些啊,我们需要呢,花一点时间给大家来做这个介绍。
09:03
先看我们这个翻译过来的话呢,这个叫做哎,Check sum啊check呢就是校验啊,那这个sum呢和所以呢,我们翻译成了叫校验和诶校验盒是一个什么东西,咱们先抛开呢,咱们现在讲这个文件头来说啊,什么叫交验盒呢,那这呢有一个这样的一个设计的思想,大家看,比如说我们现在有一个很长的字节串啊,字节串字符串,哎都行啊,有很长的字节串,那么我们要是哎或者。两个吧,哎,两个很长这个字节串,我们想比较这两个字节串呢,是不是相等,那你说怎么办啊,哎,注意你看我这个字眼呢,叫很长对吧,那你要一个字节一个字节去比的话呢,显然这个速度就比较慢,那怎么办呢?我们可以考虑设计一种算法,然后呢,给这个很长的这个字节串啊,通过这种算法我们计算一个比较短的这个值。啊,这个短的值呢,我们就称为呢,叫校验和。好,那么如果我们想比较两个很长的字节串呢是不是相等,我们就可以通过比较这两个比较短的这个交音和是不是相等来进行一个确认啊,如果呢,它俩的相等,那我们就认为呢,这两个很长的字节串呢是相等的啊,如果这俩不相等呢,那你这个很长的字节串呢,就也不相等了,这个显然时间呢是不是要更少一些呀。
10:14
啊,我一说完这个呢,大家可能会想到是不是哈希算法呀,哈希算法呢,实际上也是出于这样的一个,你可以从这个角度来讲,也出于这样的一个目的,对吧,来达到这样一个效果。好,那么如果我们把这里边儿这个很长的字节串呢,替换成咱们说的叫什么呀,叫做一的话。那我们相当于是不是可以比较两个页是不是相等,那如果比较两个页是不是相等怎么办呢?我是不是呢可以给两个页呢?哎,我们都提供一个校验和,你如果两个页的这个校验和是相等的,那我们就认为你这两个页是相同的,如果你要两个页校验和不相等呢,我就认为呢,你这两个页呢是不同的。跟说绕口令似的是吧?啊,这个意思呢,大家应该能明白吧,那肯定大家呢,在脑海当中有个大大的问号啊,说我为什么要比较两个页是不是相同呢?哎,咱们先接着往下走啊,说着说着你就知道了啊呃,那么我们首先提到这个校验和,那它对应的就是咱们文件头,注意文件头和文件尾呢,都有这个属性,文件头里边是用它,文件尾的话呢,我们在这块具体展开,文件尾的话呢,八个字节分成两部分。
11:20
那前四个字节呢,就是交验和,那跟我们这个交验和呢,相当于叫首尾呼应。啊,呼应个啥呀,来先往下看啊来带着问题我们往下走,那讲完这块呢,你就清楚了。好,大家看啊,这个我们为什么需要这个交验和呢?诶大家看我们这个页呢,咱们前面提到过,以它为最基本的单位,我们涉及到了是不是磁盘这个画个图啊,涉及到了比如我们这呢叫磁盘嘛。这呢我们叫内存啊,这呢叫内存这个呢,我们叫磁盘,咱们这个磁盘跟内存在交互的过程当中,是不是我们说以这个数据为最基本的这个单位啊,那比如我们这个内存中这个数据呢,咱们要把它写出到这个磁盘当中,这叫刷盘的操作了,那你需要呢,把这个完整的这一页呢,是不是都得同步过来这才可以,那比如说我们同步到一半的过程当中呢,这个呃,比如说断电了啊呃,这个内存中这个服务器呢,挂掉了,这个时候呢,是不是导致我们这时候呢,只同步了一半,这个是有问题的呀。
12:19
那你这就相当于不是以页为基本单位了,你拿个0.5那还不行,必须呢是整体都刷出去,或者的话呢,你刷出一半呢,如果这个呃服务器断了怎么办呢?要么呢,就是在诶重启以后,你要是剩下这一半儿呢,有记录,那你把剩下这一半记录呢,你再刷过来,这也算是一个完整的写出了,对吧?那如果说呢,你要是没有去记录这部分数据怎么办呢?你把已经刷盘到的这部分数据呢,是不是应该在回滚回我们最初的刚才那那个状态呀。诶,这就可以了,对吧,应该要达到这样的一个效果,使得我们这个数据啊,它得是一致的啊,那么我们怎么能够达到这样的一个效果呢?诶这里边儿呢,就得需要我们这个叫校验盒。下边呢,就是具体的一个实施方案啊,这有很多文字啊,我就不去念了,咱们就直接来说,比如说这是我们这个磁盘。
13:07
诶我就写个磁盘了,然后这个呢,是我们这个内存啊,这个内存用这个图来表示,然后这里边呢,是我们之前呢,比如说这个咱们把这个页呢加载到内存中,然后呢,诶这个时候你在内存中的这个页呢进行操作,那加载过程当中,我们这呢,是不是有文件头,有文件尾啊,那么文件头里边呢,就涉及到有这个叫校验和,诶我就随便写个数啊,比如这个校验盒呢,我们叫123,这个尾部呢也有个校验盒,也叫123,那就表示呢,头跟尾都是123呢,表示我们这个文件呢,它是一致的。就相当于呢,之前你写写写入的也好啊,这个时候呢,它是完整的从头写到尾了,这俩值呢是一样的,然后呢,这个呃,把这个文件呢,把这个数据页呢,加载到我们内存中的时候呢,我们就这块儿呢,你要是读还行是吧,那如果说你这块呢,进行一些update的操作,或者叫隐私的操作,是不是使得我们这个文件呢,这个数据呢,就更新了啊,一旦更新以后的话呢,如果我们涉及到呢。
14:01
你看下边写的啊,如果涉及到呢,我们这个页面更新了以后,我们需要呢,把这个数据呢,是不是呃,在一定的频率的情况下啊,什么频率啊,咱们后边讲到安度锐度日的时候,我们再说这个频率,包括这个设置的方式啊,那我们以一定的频率的方式呢,把它刷盘到我们这个磁盘中,那么在这个同步这个我们称为呢叫同步了啊,在这个同步之前,咱们需要呢,给这个内存中的这个页。啊,咱们重新的给他去计算一下这个交验和,比如计算完以后呢,我叫256吧。啊,这叫256啊,这个呢,文件尾这块呢,也是叫256,那我们现在呢,把它呢刷盘到这个里边,刷盘的过程当中呢,由于你这是文件头嘛,所以上来呢,是不是就刷这个文件头了,那我们把这个123给我换个颜色。我们把这123呢,是不是就改成了叫256了,好,那如果说呢,我们这个刷的过程当中都没有任何问题,最终呢,这个123是不是也也改成叫256了,那这时候呢,我们头文尾的这个值是一样的表示呢,我们这个同步呢,操作是完成了啊,就证明你是一页为单位,这不就全写完了嘛,对吧?好这呢是一个没有问题的,但是有可能在我们这个刷盘的过程当中啊,咱们刚才提到了这个点,呃,这个我再换一个,换个这个颜色可能不太明显啊,换个绿色吧。
15:13
啊,你比如说呢,咱们在这个刷的过程当中啊,光把这个这个假设没有这俩了啊,我们光把这个头部的这个256呢刷过来了,然后刷到一半的时候呢,突然我们这个比如说数据库服务器呢,宕机了啊,或者断电了啊等等各种各种各样的这个实际情况出现了,导致的话呢,我们这个头部呢,是256这个倒是写出去了,覆盖了原有的页中的这个头部的这个降硬盒了,但是尾部这块呢,是不是还是123啊。哎,那这时候呢,我们就会发现啊,当就是我们这时候其实已经刷盘结束了啊,因为已经宕机了嘛,诶如果我们发现呢,这个数据月这个头部跟尾部的这个校验和呢,你看不相等啊,那我们就认为呢,这个呢在同步过程当中出现了问题。啊,出现问题怎么办呢?呃,就是我们提到这个方案啊,要么呢,诶你发现这个数据呢,我们之前呢,诶这个颜色不太明显哈。
16:02
如果发现呢,这个数据呢,在我们宕机之前你有所记录啊,这个到底怎么记录啊,确实是记了还是没记啊啊这个后边呢,还挺复杂的啊,咱们还是讲到read度安度日的时候,再详细的说,咱们先把这个方案呢说清楚,如果这个记录了,你之前有记录了啊,就是我们没有刷盘的这部分,那你就在这个重启以后呢,是不是把这个数据呢再刷过来,然后使得最后这个也变成256对吧,这是一种方案,还有一种方案的话案呢,就是你把呃,如果这块呢,数据确实没有记录,那你就把已经呃刷盘的这些数据呢,是不是再回滚回去啊,哎,这这就涉及到涉及到我们叫安度日志的一个作用了,然后你再还原到我们这个123这个层面,保证它最后这个是一致的。哎,所以呢,我们这个校验盒的目的呢,你看就是校验我们这个数据呢,它整体上是不是刷盘成功了,是不是一致的啊,是不是同步完成了,诶这样的一个作用啊,这样的一个作用。这个呢,我们就解释清楚了,这个叫校验和,啊校验和。好,接着的话呢,我们再来看这个啊,这个呢叫file配置LSN,这是一个缩写啊,那对应的叫log sequence,叫日志序列的一个号啊,那页面呢,被最后修改时对应的日志序列的一个位置啊,相当于我们记录一下它这个修改时的这个日志位置了啊,然后在我们这个文件尾部的话呢,后四个字节呢,也是这个LSN。
17:19
啊,相当于他们整个呢,也是为了校验我们这个叶的一个完整性的啊,如果手部和尾部的LRN这个校验不成功的话呢,就说明同步过程当中出现问题了。OK啊,就是相当于我们这个字段呢,合在一起,或者说咱们尾部啊,就这么两个字段出现的一个,呃,唯一的作用就是为了校验我们整个页面的一个完整性啊,这就是我们这个文件尾部它的一个作用。好,这呢就是我们说的这个叫这个页的内部结构当中的这个文件头部和文件尾部。
我来说两句