00:00
好,那么关于这个页的内部结构啊,咱们就说到这儿了,然后呢,回过来我们先看一下这个课件,这个课件呢,关于这个页的内部结构呢,我又写了一个2.3,说从这个数据页的这个角度呢,我们来看一看这个B加数呢,是如何实现查询的啊这里呢,我们就对这个B加数呢,做了一个高度的抽象,每一个这个框呢,就相当于一个数据页,哎,如何实现呢?这块呢,其实咱们前边呢都已经讲过了,诶大家的话呢,需要能够用自己的语言能够表达出来。啊,就是这块呢,咱们讲到目前为止需要有两个点大家掌握的,第一个呢,就是能够呢,正确的识别出这个B加数这样的一个数据结构,包括呢,我们前面说到的跟B数的区别,跟这个哈希的这样的区别,对吧,也要能够说出来,其次的话呢,你要能够知道我们这个B数,咱们作为这个索引结构出现的话呢,它的一些数据的特征,咱们前面讲到的这个页的内部结构呢,其实就是在讲这个特征的,对吧?就是如果呢,真的问到你啊,比如面试官问到你说你怎么证明它是一个双向链表的,你怎么证明里边这个记录跟记录之间是个单链表的,你是不是得能够表达出来呀?哎,这是OK的,当然一般呢,我觉得他不会问。
01:06
啊,这个呢,你可以自己主动的说出来是吧,这个呢,就是你可以就去卷别人了,就啊。好啊,我说的是内卷的卷啊,然后的话呢,我们再看一看,这里边呢,提到了一个问题,说这个普通索引和唯一索引呢,在查询效率上呢,有什么不同啊,这块呢,大家可能有点迷茫,说什么叫普通索引,什么叫唯一索引,咱们下一章呢,就开始去创建,就会说普通索引的话呢,呃,你比如说咱们讲上一章的时候呢,在一个呃表当中,比如这个表呢,我们就要T这个表,咱们不是当时有这个C1 C2C3这样三个字段,对吧,这是主件啊,C243呢,就是普通的这个字段,比如是in特类型啊,我差类型啊等等,也没有其他的约束,我们这个CR字段上呢,我们在它上面创建了个索引,那比如说就长这个样子,那它呢,就是一个叫普通索引,那什么叫这个唯一索引呢?那比如说我们这个C2这个字段呢,我们加了一个叫unique的约束。啊,就像那个唯一约束,加上这个约束以后呢,针对这个CR创建的索引呢,就叫做唯一索引了。
02:01
那跟我们这个普通索引的区别是什么呢?不外乎呢,就是我们这个CR字段呢,在存放的过程当中,这个字段呢,它不会有这个重复的这个值呢,对吧,你比如我们这一条记录,这一条记录针对我们这个C2的话呢,这个呢,假设这个C2这个字段是十,下一个肯定不是十了。对吧,你要下一个也是十的话呢,那有可能它就只是一个普通索引,就这样的区别说这样两种索引呢,在查询效率上有什么不同呢。大家想想有什么不同啊?嗯,能想出来吗?其实主要的区别就是在于呢,我们在查找的过程当中,你比如说我们要找某条记录的话呢,就确定了是这样的一个数页了,对吧,那唯一,所以呢,比如我们找的恰好这个C2呢,就是十,如果我们找到一条记录呢,这个C2呢,就是十了,那我们到时到此呢,是不是就结束了,就没有必要呢,再往后去找了,因为下个肯定不是十了,最小也是11,对吧?这个就是我们说唯一索引它的一个特点,那如果我们是个普通索引呢,你找到这个十还要不要往下边去找啊,是不是还应该再看一看,因为下一条记录有可能这个C2呢,还是十,是这意思吧。
03:02
那就这样个区别,那么下一条十,那下一条可能还是十连着可能有好几个十,那对于我们已经把这个数据,如果呃已经这个这个不能画大框了,大框咱们是需要谁咱加咱需要谁加载,谁不能画个大框啊这个我们需要呢,这个数页我已经把这个数据呢加载到内存中了,在内存中我们通过CPU呢,去跟内存交互的时候,说你是这个唯一索引,就查到这一个,你要是一个。什么呀,是一个普通索引呢,我们可能要找好几条记录,那么这个找一条还是找三条,找四条,其实区别不大啊,这个呢,咱们都可以忽略掉的啊,所以说在这个普通索引呢,跟唯一索引呢,我们在查询效率上来讲呢,我们基本上呢,是可以忽略掉这个CPU呢,多消耗的找后边那几条记录的这个时间啊就。完事啊,这就是他们俩的一个区别,行,那这个说完以后的话呢,我们下面呢,就正式的来讲解一下这个DB这个行格式。呃,每每一行记录,每一条记录,我们称为呢,呃,对应的这个格式呢,就叫行格式了,所以呢,也可以叫做记录格式啊,都一样啊,一说呢都能明白啊,那这块呢,同样道理,咱们为了方便大家去理解呢,我这块呢,直接也是画成了一个思维导图,咱们就回归到思维导图上呢来进行查看。
04:12
首先的话呢,我们先表达一下,咱们对应的这个行格式呢,有几种。行格式的话呢,我们主要呢,就说四种,第一个呢,叫做compact是吧,这个行格式呢,翻译过来呢,这个叫紧凑的啊,就是紧凑的紧密的是吧,就是这个单词的意思,然后下边呢,叫dynamic啊,Compressed dynamic就是动态的意思,Compressed就是经过压缩的啊,被压缩的啊,这个redundant啊,这个意思呢,就是冗余的意思啊,冗余意思你看这个名的话呢,咱们就不太受待见是吧,所以最后讲它,那我们这块呢,先把这个compet呢,相当于当成一种经典的模式来讲解,然后呢再说诶其他这个格式。好,那首先的话呢,我们比较关心的就是这个MYSQL8当中啊,它默认的这个行格式是什么对吧?那比较简单,我们就直接呢,来查询一下这个变量的这个值就可以了,CTRLC一下回到我们这个层面啊,咱们找到这块呢,直接粘过来一回车,是不是我们看到这个呢,是不是叫dynamic这样一种格式啊。
05:09
没问题是吧,那如果我们在这个MYSQL5.7当中是什么格式呢,我们这块呢,也登录一下。啊,Mexicoq-U,再root-P啊登录一下,然后呢,我们也是给他粘过来一回车,也是这个叫dynamic。这个dynamic呢,跟我们这个comppress,这个compac呢,其实他们差别不是特别大,所以呢,我们先讲这个经典呢,叫compact啊这样的一种格式,OK,这个呢是我们查看的,就是默认的咱们这个变量的一个值,那同时呢,我们如果想看具体的一个表,说它使用的是哪种这个行格式的话呢,我们也可以通过这样的一个指令,比如叫show table status啊,举个例子,你比如说回过来咱们呢,去首先叫use一下,叫DB1,这个咱都知道有这样的一个数据库了,对吧,那我们呢,去收一下。Tables。我这里边呢,是不是有这样的几个表啊,那我们比如说就看一下这个EPE这个表,它使用的这个行格式呢,是什么,怎么做呢?我们叫show table啊stays,然后like,这我们写一个叫E1,哎这么着,然后杠这一下可以回车,那么在这个查询结果当中,我们看到这个行格式呢,是不是叫dynamic呀。
06:18
啊,就是我们这种叫动态的这个格式。是吧,诶那回头呢,我们创建表的时候呢,这个呃,咱们呢,都能够非常清晰的知道他用的这个行格式是什么,不一定跟我们这个默认的整个的这个创建表的这个dynamic纳格式一样的,不一定一样,那UIG呢,就是我们在创建表的时候呢,是不是可以独立的去指定这个表使用这个行格式啊,那注意呢,其实我们上边这个语法了,我们在创建表的时候,咱们可应呢,去指定叫肉啊这个format,那对应的这个行格式写出来就OK了。你看举个例子,你比如说我们就用这个叫comp这样一种格式,回过来咱们可以创建个表叫EP3吧,我这块写create一个table。啊P3,然后呢,可以这样啊,ID in的类型,来一个name啊,What类型。
07:06
啊,比如长度呢是15对吧,然后再括起来,然后在后边这块呢,我们就可以写呢,叫肉啊format,然后冒号啊叫compacac是吧,就它呀,哎回撤一下,这样的话呢,我们就创建了一个新的这个表,然后我们接着呢,可以通过这个show,这个叫a table status。啊,然后like。啊,这个我们写EP3。哎,这个杠G,哎这么着,那此时呢,我们看到当前我们这个表使用的这个行格式呢,是不是叫comp派这种格式啊,那叫紧凑型的一种格式,没问题对吧,那接着的话呢,我们还可以呢,去做一个修改,你比如我们这个叫alter啊,比如说我们这样吧。我这个EP2。这个时候呢,它使用的也是这个胆单比,然后我们可以呢,叫aler一个table啊,然后呢叫EP2啊,怎么着呢,我们叫roll。Permit啊,等于比如我们也改成这个compact啊,然后再来一个回车。
08:03
修改了,修改完以后呢,我们再看一下这个咱们EP2此时的话呢,你会发现它这个行格式呢,就变成comp了,相当于我们修改了它的这个诶行格式对吧?行这呢就是我们说的这样的一个语法规则啊,就说到这儿了,行,那么下边呢,就是具体的我们来讲解一下具体的这个行格式的一个情况啊。好,那么下面的话呢,咱们就具体的开始讲解这些行格式,那我们的重点呢,讲解的其实是这个compact啊这种行格式,好,那我们这块呢,展开来说明,那么从MYSQL5.1这个版本开始啊,我们设置的这个默认的就叫做comp派这样一种行格式,那么这个行格式呢,它将我们的一条数据记录啊分成了两个部分,一个部分呢,叫做记录的真实数据列一列二是吧,好多这个列啊,实际上呢,这里边还包括了我们的隐藏列,一会儿呢我们再说,然后除了这部分之外呢,我们还提供了记录的额外信息。额外信息呢,就三块叫变长字段长度列表,闹纸列表和记录头信息就这三块,那我们讲解的话呢,是不是就分成这三块,再加上一个真实的,呃,这个记录信息就可以了,好,那我们就按照这个顺序呢来进行说明,首先啊来看一下叫变长字段长度列表。
09:15
这个呢是干什么用的,其实我们看这个名字啊,基本上也就暴露出来了这个信息了啊,那我们来看一看是怎么回事说呢,咱们再定义这个表啊,举个例子,咱们刚才那块呢,是不是有个表啊。哎,我这块呢,稍微的粘一下,咱们就以这个表呢举例子来进行这个说明,好把这个呢放到这儿。啊,这个添加的记录呢,咱们也暂且呢把它拿出来啊,我放在这儿方便呢,咱们来进行了一个解释,首先呢,我们来看这个叫变长字段,这个长度列表说呢,我们在这个SQL定义这个表中的字段的类型的时候,啊,咱们在上面呢,就专门有一章,是不是讲这个具体的数据类型的,对吧?那其中呢,有一类类型呢,是不是就变长的呀,你比如这个verar,比如这叫bay,还有这个testlob啊等等这些呢,都属于这个变长这个字段。
10:02
变长这个字呢,你比如我们这里边写的这个work差呢,写的是八,但是我们真实存储这个,呃,第四这个列的时候呢,我们放在这个数据呢,你比如我这儿啊,放的就是我名字的这个缩写了啊宋文康这个呢,是不是有六个字符是吧?诶我们这写的是八个,你这是六个啊,在我们用阿斯格码的时候呢,这字符字节相当于就是1:1的关系了啊,那我这六个,这是八个,实际上我们只存呢,呃,六个啊,你是不是空出来两个呀,那这时候呢,我们就需要呢,使用一个专门的一个值啊去记录一下,我们其实并没有放八个,只是六个就够。啊,就是这样一个意思,所以这才体现我们这个叫变长的,真正在底层存的时候,我们就用六个,呃,其实是字节了,对吧,因为这是二码的方式啊,那六个字符呢,就使用六个字节存就OK了。那么我们前面的这个,呃,这个COLUMN2啊,COLUMN1这样的两个字段的话呢,也都是变长的,所以我们就需要呢,专门得用这个一个位置呢,去记录一下,我们这种变长的字段呢,到底是存了几个数据啊,我们这个长度实际到底是多少,诶这个呢,就是我们这里边提到叫变长字段的长度列表,他要做的这个事情。
11:13
OK,那么具体在存储的时候呢,需要注意到一个细节,就是它呢跟我们这个字段声明的这个顺序啊,是反过来的啊,比如说我们这个A字段呢,它实际的这个长度呢是十,B字段呢,实际长度是15,在底层存的时候呢,就是先写15后写十。当然你注意我这块写的是十进制,那咱们底层存的话,肯定不是十进制了,是不是应该是这个二进制对吧?那通常呢,我们要是查看这个,嗯,自解码文件的话呢,一般咱们都翻译成就16进制了啊,就是不用十进制是吧?我这儿写十进制是方便大家去理解。好,这个呢就说清楚了,然后的话呢,我们就以就以咱们这个呃表为例啊,这个表下边我们不是添加了两条数据嘛,是吧,那以这个为例的话呢,比如说我们就看第一条数据,这个呢,咱们队呢叫张三李四王五啊,这个是我的啊送HK好,那么这里边儿的话呢,我们这个第三个字段呢,是一个定长的,所以我们就不关心他了。
12:09
啊就不关心它了,主要我们关心的就是第一列第二列和这个第四列啊,那分别呢,我们现有存的数据的长度呢,是846,那我们在表示的时候呢,诶先要把它转换成这个16进制来看啊,这恰好呢,还就是这个846的这个方式,对吧?那么我们在存储的时候呢,在我们这个变长字段长度列表里边,我们要倒叙着去存,所以呢,应该是零六啊0408,哎这样的方式去存,这呢就分别占一个字节。啊,060408这样就可以了啊,就放到这个位置就行,那中间的话呢,我们那个定场呢,就不管它了啊,就这样的一个意思。好,那这块呢,我们就说清楚了,呃,咱们介绍完以后呢,一会儿我们看真实的底层这个数据的时候呢,咱们可以验证一下,看是不是这样回事。那接着我们再看第二个叫做值的列表啊,Now值列表什么意思啊,说呢,这个compare派的这个行格式啊,它会把哎,会把可以为now值的这个列啊统一的管理起来,存在一个标记为now值的这个列表项当中啊,如果表中呢,没有允许存放now值的这个列啊,我们这个列表呢,就不放了啊,就不存在了,就是这个意思。
13:18
这个我们为什么要定这个not这个列表呢。啊,这个呢,其实也很容易的去解释,哎,我就抛开这个例子,你比如说我们这个表中呢,我就定义了这样的12344个字段,对吧,那这四个字段当中呢,你比如我们这个字段呢,是个no啊这个字段呢也是个no,那我们这个呢,比如说是这个值呢是A啊这个字段这个值呢是B,那咱们底层在存的时候呢,你说我存的这个A,我要接着来写这个B的话呢,那咱们要这样写,那大家你可能会想,那我们是不是识别的时候,有可能把这个当成A,把这个B呢,是不是复制给他了,那这两个又没有了,这是不是就报错了。就相当于我们完全忽略掉这个尿值的话呢,好像不是太好。啊,这个不太好,因为我们可能就匹配不上了,人家上面有四个字段,你这块呢就写了俩,这不行是吧?那同学说好,那我就不这样做,我这呢写成是A,你这个B呢,还是第四个位置,那么第二个位置和第三个位置怎么办呢?那我们要不用一个字符来表示一下这个闹吧,啊,你可以自己指定一个字符去表示是吧,但是我们这样一指定的话呢,这个我们又觉得呢,挺浪费空间的。
14:19
啊,那这就很纠结了,不表示不行,然后用一个特殊的表示呢,又很浪费空间,那怎么办呢?诶咱们就专门的去维护一个列表,那个列表里边呢,就来记录呢,它是不是no,那这个非常简单,咱们也用不着很长的这个呃字符或者字符串去表示的,咱们就用一个bit位来表示就行。如果你这个位置上的这个值呢,它呃,这个值为零,二进制位置上这个值是零,表示呢,你就不是,哎,如果你要是一的话呢,表示的你就是no。啊,你举个例子,你比如说我们以这条第二条这个记录为例,那它这块呢,是不是这两个都不是闹啊,那我们是不是就用零来表示啊,啊那么这两个呢,都是为no的,那我们是不是就用两个一来表示啊,是不是就001。
15:05
是这意思吧,哎,那这块你注意我们还得是这个倒叙着来,倒叙来是不是就1100了。哎,就这个意思啊,你看我们这个就这样写的是吧,哎,但是你会发现呢,诶怎么我们这块表示的时候呢,不是1100,怎么少个零呢。诶这块呢,你看110,诶我这个呢,写的是,诶这样写的,你看这里边儿呢,我们是不是有一个这个COLUMN2它呢是一个not not呀。他都明确说他是个闹闹了啊,我们这个时候呢,是不是就不用管它了啊,这是一个点啊,这个大家要注意一下,呃,还有的话呢,就是有的时候我们在一个表当中呢,明确指明它一个主见了啊,你比如说我们这个C这个是主键,主键呢也一定是非空的啊,我们在处理的时候呢,就也不考虑它了,就是如果明确表达呢,它是非空的呢,我们就不管了。哎,只把其他的几个呢考虑在内,然后倒叙的给它表示出来啊就行,嗯,行,这样呢,我们就说清楚了,这个叫闹的这样一个场景,好,那么记录头信息呢,咱们再讲这个页的这个结构的时候呢,也说到过了,然后接下来咱们再看的话呢,就是这个记录的一个真实的数据。
16:08
哎,记录的这个真实数据。这个记录的真实数据呢,诶回到这儿是不是就是我们的这一部分了,这部分呢,说这有啥可讲的,比较简单嘛,啊,其实这里边儿呢,还是有点这个东西的啊,这里边儿的话呢,除了我们真实的这个字段之外啊,咱们说还有可能会去记录一些隐藏的列。啊,隐藏列主要呢,我们提到有三个,第一个呢叫做这个肉ID啊,第二呢叫transaction ID啊,第三个呢叫肉pointer,这个涉及到我们叫回滚指针,这个呢叫事物ID,这个呢叫做隐藏的这个行ID,那行ID是吧,那那真实这个名呢,其实是叫这个DBID和DB transaction ID和这个roll pointer啊哎,就是真实的其实是叫这个名。好,那我们为什么要提供这样的一个字段呢?啊,隐藏一个行业里说可以唯一的标识,一条记录。啊,这个呢,就提到了,咱们前面呢,讲到这个,嗯,这个叫什么句促索引的时候啊,大家回顾一下,我们当时说过这个事儿啊,这个说一个表啊,对于这个in DB啊,大家你看我说的对不对啊,对于这个in DB这种存储引擎,我们说呢,诶构建的这个表结构在底层当中,咱们说一定啊,或者一定会有一个句子索引,对吧?而且这个句促索引的话呢,我们有一句话呢,是不是叫索引及数据,数据及索引,这个索引的话呢,指的就是句促索引。
17:30
啊,那么这个居住索引的话呢,怎么创建的,我们说通常是不是拿这个主键来,诶,默认帮我们去创建对吧?那如果说我们要没有定义主键的话呢,它是不是自动的会选择这个表当中生命有这个有这样的字段的这个列,是不是给我们去创建一个这个呃居组索引,对吧?如那如果说呢,我们这个表中根本就没有unique这个字段。约束的字段怎么办呢?咱们当时讲的时候是说说系统呢,会自动的给我们提供一个啊,这个相当于隐藏的一个,呃,组建这样的一个字段一样来帮我们去完成这个技术索引的一个搭建,那这里边所谓的这个隐藏的这个字段,实际上指的就是我们的UID。
18:09
啊,这个ID呢,能满足的点呢,就是唯一的标识,一条记录啊,就是具备这个主见的特征啊,非空且唯一。啊,就是它的作用,那如果一个表中呢,我们定义了这个组件的话呢,就没有必要呢,再去提供这个ID了。啊,这是这样一个特征,那下边的话呢,这个transaction ID和这个的话呢,我们放到后边的第14章中,第14章当我们讲这个MY这个事物的这个日志的时候呢,呃,咱们涉及到这个,诶瑞度日志,安度日志啊,到时候我们再提到这个事务ID和回滚指针啊,目前呢,我们讲的还说不清楚啊好,这个呢,我们就说到这儿。嗯,接着的话呢,咱们去分析一个啊,分析一个题目,相当于我们关于这个记录这块呢,算是说完了,咱们分析一下刚才提到的这里边的有这个哎,变长字段的长度列表,这个now指列表啊,我们说呢是倒叙的,说怎么着这个我们能不能证明一下啊,哎,那证明的话呢,咱们是不是就翻一下底层这个文件了,OK,那这呢,我列了一个例子。
19:06
这个例子的话呢,我就不在这个Linux里边去这个演示了啊,因为在Linux里边创建完以后呢,我们还得需要通过这个远程的这个工具,把它呢,再导到咱们Windows里边去看,没必要了,咱们直接在Windows里边看就可以了,所以呢,我们这么着做啊,大家呢,也可以跟我一样去处理啊。首先的话呢,把我们这个sol呢打开,打开以后的话呢,我们创建一个新的连接,这呢连接的话呢,咱们就在这个。呃,8.0,这呢是我这个Windows操作系统的。啊,Windows系统的是吧,8.0好连接一下。啊,可以了,可以以后的话呢,我们就挑一个数据库吧,那比如我们就挑了一个艾特硅谷DB。嗯,在这下边我们看一下这个表。啊,这个要看啥呢?其实主要是因为我们现在要创建一个表,我就直接来了啊把它呢直接CTRLC一下。哎,粘过来CTRLV。啊,这个变大一点,这呢我创建一个表叫my test,看一下这块有没有重名的,没有还好是吧,好在这个数据库下呢,我们创建一个表,这个表呢有12344个字段,哎,稍微有个印象啊,第一个第二个和第四个呢,我们是work差的,这个呢是一个char类型的,然后in DB啊这个拉丁的这个呢是comp派,主要是我们看这个comp派的好把这个选中呢,我们做一个执行,创建了一个表。
20:20
然后接下来的话呢,我们往这个表中呢,添加三条记录啊,走起。可以了,对吧,创建完以后的话呢,我们这么着。啊,这个都收起来。找到一下我们这个物理磁盘文件上的这样的一个表的存储的这个文件啊,找到我们program data。这个呢,大家在讲上篇的时候呢,咱们都说过啊,找到这个data对吧,然后呢,我们是放在了艾特硅谷DB这个下边叫my test,是不是就它呀,在8.0当中呢,我们就这个F2M表结构啊,和我们这个表中的数据啊,所以啊,是不是都集中在我们这个ibd这样的一个独立表空间当中了,对吧?啊那么大家呢,可以呢,点右键我们使用notepad加加呢打开。
21:01
打开以后呢,发现非常的不友好,怎么办呀,我们再去运行一下,使用一下这个叫呃,16进制转换的这样的一个插件,那没有的话呢,大家可以在这个农特派加加上去安装一下这个插件就可以了啊好,那么把这个插件的话呢,我们点开这时候呢,大家就看到这样的一个表格。啊,看到一个这样的表格,那么这个表格当中呢,我们就能够找这个我们要找的这个具体的数据啊,它存放在哪儿了啊存放在哪了啊实际上呢,它存放这个段呢,我就从这里边截出来了啊,咱们直接呢,看我这里边儿这个截的这个图就行,哎,这里边呢,我们能够找到的就是这个AC070在这个段呢,存储着呢。啊,大家说那这个确定是有吗?你比如我把这个321这个呢,我CTRLC一下,咱们回到这块啊,我CTRLF啊CTRLV,然后find一下。哎,我在这呢,就找到了。诶这个还不是,诶是这块啊啊这个呢,前面这个字段呢,哎,这边是0070啊跟我这块呢。
22:00
哎,不太一样了是吧,哎,不太一样了,就是这个原来我结的时候呢,是我在这个场景下呢找到的啊,跟这个场景呢,可能就有点区别了,行,那我呢,就在这个里边呢,咱们做一个分析啊,因为我下边这块写的都是针对这个来进行分析的。好,大家来看。这个我们这个里边呢,从这个位置开始去找啊,就是下边呢,我每画一个颜色,相当于呢,就是对应的我们前面提到这个行格式里边的每一个这个部分啊,做的这个对应的关系,那么我们第一条数据啊,第一条数据呢,咱们这个我把这呢结页图方便呢大家呢。哎,及时呢,去看到。哎,把这个呢盯一下。可以了是吧,好,那么这呢,我们开始去做这个分析啊,首先呢,我们看到这个叫030201,这个030201呢,它们衡量呢,就是我们这个变长字段这个长度列表。变成字料这个长度表,注意它是一个逆序的一个状态,好,那我们怎么去看呢?呃,咱们这里边儿呢,是不是这个它。
23:04
这个和这个是不是对应的,我们是变长的,所以到这来咱们这块呢,这这些写的是长度不能超过十了,我们这里边呢,到这来的话呢,这写的是不是三个呀,哎,所以这就是零三是吧?呃,零二呢,注意这个C23呢就不管了,因为它是定长的啊,那我们再看呢,是不是就C22了,C2呢也是一个BB的,所以这是不是就零二,然后接着这个A呢,你就写了一个是不是就零一啊。所以它们三个衡量呢,就是我们变长字段这个长列表啊,就这个下边这个呢,叫knowledge列表,这个not列表的话呢,在我们这个里边呢,他们几个呢,全都是哎非空的啊,全都是非空的,所以这个都是就零零啊来表示了。啊,都是零零的来表示的行,哎,关于这个具体这个尿纸列表这块呢,我们再通过这个第三个例子呢,咱们一会儿呢,再强调一下啊,哎,这个呢,我们先知道这是零零,然后再接着往下啊,从这块开始,12345这几个呢为代表的就是我们叫recorder啊recorder就我们记录头信息。
24:02
啊,记住头信息默认的是不是就说五个字节呀,啊12345是不是这五个字节。好没问题啊,诶这五个自己里边呢,这个最后这个叫来后边这个看002C这块来衡量,其实就是我们这个next record。就是我们下一条这个指针所指向的,就从我们当前这个记录的位置呢,哎,再往后呢,偏移这么长个长度,就找到了下一条记录啊,这是它的一个意思,好,再往后的话呢,我们这儿呢,是不是有六个。哎,这六个为代表的就是我们这个肉ID。啊,就我们这个UID啊,相当于是我们这个度DB呢,自动的帮我们去创建的,你看我们这里边呢,是不是没有指明这个主件呀,所以它自动的帮我们去做了一个创建。啊,这个就是它,那再往后的话呢,123456啊这六个的话呢,为代表的就是我们这个叫transaction ID。那就我们上面提到的那六个字节,六个字节传3ID没问题啊,这个咱们知道这个事儿就可以了,然后再往下这块呢,1234567啊是不是七个的话呢,对应的就我们这叫RO pointer啊啊就我们叫回滚指针啊,这就过了啊,然后再往这块呢,61,哎,这就比较熟悉了,它呢对应的就是我们这个里边放的A它的这个值。
25:12
A呢,哎,我们这个对应的就是61,这是咱们16进制来表示的啊。好,这是它,然后呢,再往这个呢,叫62 62这个呢,就是我们后边这个BB。啊BB啊,六十二六十二,然后下边这还有一个BB,这个BB的话呢,你看六十二六十二,诶怎么这个这么长呢,一直到这了。哎,一直到这是吧,这个呢是咱们这个地址了,相当于啊,哎,是因为呢,我们这是个定长的,一共是十个长度,你数一下一二,这就是两个BB,然后用这个20呢来表示,就是相当于是个空的啊一这是一二,然后3456789,是不是到这儿就是十啊。啊,没问题啊,没问题行,那这呢,就是我们这个第三个字段,然后第四个字段呢,这个叫CCC啊,你看六十三六十三六十三啊,这就是我们说的这个。啊,那么至此的话,你看我们这个真实的这个数据当中涉及到了,呃,既有我们这个叫呃ID啊,有我们这个叫trans ID,还有我们这个叫roomer,哎这块隐藏的都有了,还有我们真实的也都有,前面这几个呢,我们也都提到了,也都有对吧?哎,这个变长的,呃,这个变长字段长度列表,我们这个not值的这个列表,还有我们后边这个对应的这个呃记录头信息你看都是完整的。
26:26
导致它,哎,如果大家你要是还放到这块来看的话呢,就是对应的我们这里边儿的一个情况,那这是不是也都有。哎,跟我刚才这个说的实际上是一样的是吧,还是一样的啊,就在这块,相当于我们现在来讲这个数据库,咱都已经卷到这个程度了,都已经开始翻这个idbd这里边底层的这个二进制的这个资金码文件了,相当于是是吧,OK。嗯,回过来,呃,那么第二条记录这块呢,没啥可说的啊,跟我们第一条呢,其实类似啊,大家去做分析就行,它也都是非空的嘛,所以我们重心呢就不在这儿了,接着的话呢,我们再分析一下这个第三条这个记录啊,第三条记录呢,我们重点来说一下,这个就是not纸的这个列表啊,Not纸列表好,那我们第三条记录的话呢,其实是在。
27:08
哎,这个呢,得需要基于你把这个第二条记录呢,都给他分析完以后啊,咱们第二条记录最后不是有这个叫三个F吧,哎,其实对应的就是我们这三个F,那在这也有是吧?哎,那你要在这块看的话呢,回过来。他是不是就在这块了。哎,三个F,那后边这块呢,就是我们第三条记录OK回来啊。这个第三条记录的话呢,来咱们做分析。这个前面这个呢,来表达的还是我们说的这个变长字段的长度列表,它的一个逆序。啊,这个呢叫0301啊,这个该怎么去理解呢?啊,变长字段的长度列表,我们这个看一下啊这个这个呃,这是一个,这是就是我们这个倒着往回走呗。嗯,变长字段长度里边这个呢,我们放的是不是三个呀,所以这个就是零三。没问题是吧,然后呢,这个呢是闹了啊,闹着这就对应的就没有了,然后这个呢,我们放了一个啊,是不是就零一啊。
28:02
啊,这两个里边的话呢,因为这个CR3呢,它本身是一个定场呢,我们本身不关注,那C2呢,就看它它这个no不管了,诶所以这块呢,只写了这个C1啊是零一啊变长字段长度列表过了,好下边这个叫零六。这个零六呢,衡量了就是我们这个not的列表。啊,那为什么这个值呢,是零六呢,这个怎么去理解说不应该是零六啊,应该是什么呀。啊,应该咱们分析一下,咱们倒着往前走,如果呢,你要不是这个闹的话呢,就写零,如果呢是闹的话就写一写一写零,然后呢,我们这个倒着这样来是不是就是0110是吧?哎,这样往前走就出来了,那这块呢,大家你看一下这个值是几啊。啊,这个呢,我们是零,这个是不是就二这个值呢,是不是四啊A1加A恰好是不是就是六,哎,所以我们这个呢,就是零六。啊,咱们这呢是16进制啊,你记着把它换成这个二进制来看啊就可以了。行,那这呢,咱们不就解释清楚了,还是这个倒叙的一个情况,然后呢,再往下的话呢,就是我们长度为五的一个,是不是叫记录头信息啊,哎,那后边呢,这块还是表达了我们这个next record的这样一个情况啊好,那再往后走的话呢,这个是长度为呃六的,那这个呢,是我们叫肉ID吧。
29:15
啊,咱们前面说过了,这不UID吗?来六个啊,因为咱们这没有定义主键啊,所以这个UID呢,就给我们提供了。然后再往后的话呢,123456,这个呢,就要传3ID啊不说了,1234567。七个的话呢,是我们这个hunter啊回滚指针。然后再往后啊,这个64的话呢,是不是就我们真实的这个数据了啊,那这个64是谁啊,是不是就我们这个D啊,哎,他。哎,它是我们这个,哎64好,然后这两这不是no,呃,这个nu呢,我们根本就不管它了,是不是直接呢,我们存呢,就开始存这个三个F了,哎这呢,就我们前面说到的咱们这个,诶为了能够让这个空间啊,这不是叫compac,就是紧凑的是吧?诶让我们这个空间呢,就是没有冗余,咱们呢,只记录一下你当前有数据的这个中间空的怎么办呢?咱们在前边这块不已经标记出来你哪些位置空了吗?
30:06
所以我们在匹配数据的时候呢,这个就给了我们这个D了。啊,给了我们这个第一列了,然后呢,你第二列第三列这块呢,通过这个信息不就能知道你是两个,哎,是不是两个一相当于就是两个no是吧?然后再往后呢,不是no了,那是几啊哎,我们这块不就看到是三个F吗?哎,就这样一个情况啊,相当于呢,我们就相当于把这个comp派这种格式呢,解释清楚以后呢,我们还通过底层的这个。啊,这个二进制的文件啊,我们还进行了一个分析啊,确实如此。啊,这已经是都翻到这个层次了,这个大家应该就是没啥再往下翻的了,对吧?好,那么关于这个派的这种行格式啊,咱们就说到这儿。
我来说两句