00:00
好,那么关于这个compact的呢,这个行格式呢,咱们就说到这儿了,然后接下来的话呢,我们看另外的两个行格式啊,这两个的话呢,它的区别不是特别大,所以呢,我就放在一起了,叫做dynamic和compress的这个行格式,那咱们看到了,在MYQL5.7和8.0当中啊,默认使用的都是这个dynamic这种方式叫做动态的,对吧?那么这两个格式啊,实际上呢,跟我们这个compac呢,差别不是太大,所以呢,我们刚才才会发花这个比较大这个篇幅呢,咱们去讲这个compact,讲完之后呢,我们再看一下他们的区别是什么就知道了,对吧?那么要想说清楚他俩跟compact这个区别的话呢,首先啊,我们要给大家呢引入一个概念,这个概念呢,就叫这个行一出的概念啊,所以我们首先呢,先把这个概念呢弄清楚,这个弄清楚之后呢,我们再一解释就一目了然了啊好,那我们这块呢,说一下这叫行溢出。行一出来说因诺DB呢,存储引擎可以将一条记录中的某些数据啊,存储在真正的数据页面之外,哎,就是我们这样的一个需求,那怎么去看待这个事儿呢?来这块呢,我们首先呢,举一个例子啊,我把这个例子呢,直接咱们CTRLC一下,这块呢,咱们在这个来这块呢,来演示也好,或者在我们这个呃,SQ要中演示也好,其实都行是吧,这个显示的效果呢,其实是一样的,那我不妨呢,我就放在咱们的SQ当中了,好大家看啊,我们现在呢,创建了一个表,我这个表里边呢有一个字段,这个字段呢是一个work差类型,注意看。
01:29
我此时这个字段的长度呢,我写的叫655356535什么意思啊,是不是我们正好呢,诶算是咱们这个最长的这个长度了,就是大家不知道还记不记得咱们讲上篇的时候呢,说到这个work差的时候呢,最长的话呢,其实它能够存放6535个字节。还有印象吗?就说我早忘了是吧,哎,因为毕竟呢,咱们平时在开发当中啊,咱们一般不会涉及到的是不是这么长的这个字节了,来你找到我们这个上篇当时讲解的这个数据类型精讲。
02:01
诶在这里边呢,我们去找到咱们提到的这个字符串这样的一种格式,关于这个叉和V叉,诶你看这个work叉里边这个M,我们说它的范围呢,叫6535是吧,哎,这个我们写的是一个极限的,就是我们这时候这个指定它的这个长度呢,6535的这个,这个算是字节了啊字节了行,那么回过来。呃,那么字节跟字符的话呢,我们说本身呢,是不是就有一个差别啊,那根据这个字符集呢,是有关系的啊UTF8MB3当中,那我们这块呢,一个字符,比如我们一个汉字的是吧,一个汉字呢,实际上占三个字节嘛,啊这个大家应该清楚,所以这块呢,我们把这个事儿呢,先过滤掉啊,咱们就用这个二次码,我要用二次码的话呢,你这个6535个字节是不是跟这个字符就一样了。对吧,所以我这儿呢,写的65535,咱们实际上呢,这块想表达这个位置呢,是字符的意思,由于呢,我使用的是一个X码的话呢,所以这块呢,其实你可以。表示的其实就是我们说的这个字节的意思啊。OK吧啊。
03:00
有同学感觉还有点懵,我猜我猜你是有点懵啊,来,你看我这边呢,Create table,咱们在讲这个上篇的时候呢,其实呃说过这样的问题,比如说我们这个还叫一个water,这个叫size。啊size,然后这个呢,我叫个DEMO0吧,啊这么着来,我们这时候呢,把它往下走一下C啊来一个war。啊来个我差,我这就写一个叫6553,诶三五是吧,诶我这么着一下,诶我这时候呢,没有指明使用这个所谓的这个叉set啊,你看我们这种选中做个执行,他是不是就给我们报错了,它这个报错的话呢,是我们这个C呢,最多的是21845,这个21845是一个什么概念呢?来咱们走一下。这块我们选择一个这个,嗯,科学计算机型,呃,21845是吧,21845咱们乘以一个三。走起是不是正好呢,是6535,诶就是说这个位置的话呢,咱们其实刻画的是多少个字符的意思啊,咱们没有显示指明字符集的时候呢,默认的不就是我们,诶咱们默认设置的那个UTF8嘛,呃,相当于呢,我们对应的就是一个字符呢,是不是三个字节的意思好。
04:06
这个呢,我们明显看到它是不行的啊,那那这个位置呢,我们用的是二码了,那咱们用的是二码的情况下的话呢,一个字符就是等于一个字节的存储空间,那么我问说这个的位置我们能写这个6535嘛,感觉上的话呢,应该没有问题是吧?来我们走起好大家看此时的话呢,照样呢给我们去报错了。啊,按说不应该是吧,诶说诶怎么会报错呢?诶那这时候我们说明啊,其实咱们在存储这个worka这个类型字段的时候呢,呃,极限是6535,但是呢,它其实存储它的时候,因为它是变长的,所以我们还得需要一些额外的空间来记录你到底存储的这个长度是多少,所以6535呢,实际上是达不到的啊你看这个说你太长了对吧?嗯,那这个咱们怎么弄呢?哎,这里边我们要考虑到一个点啊,就是对于work差类型,我们呃需要呢变长的嘛,得用两个字节呢去存储它的这个,呃真实的这个长度,那怎么办呢?那我们要想能够存储它下,呃存储存储下它的话呢,我这个位置呢,呃一个呢是得减个二是吧,减个二的话呢,是不是6533吧。
05:12
哎,那这个那就可以了吗?来我们这块呢,选中了再走,你看是不是还是报错了呀。啊,这个咱们上面报错了,他也没创建成功,所以我这个名就没改啊,哎,还是报错了,所以还不行,说我这块呢,还得再减一个一啊,我就变成6532了,对吧?来此时呢,我们选中了再执行。啊,大家看这时候呢,咱们就创建成功了,为什么我们减去三个呢?诶这里边我们会涉及到呢,这个一个呢,是叫呃这个。嗯,我就直接写吧,叫65533是吧,然后再加上是不是有两个字节的。哎,两个字节的是不是我们记录一下这个变长字段这个长度啊。啊,变长。变长,诶这个变啊。
06:01
哎,字段,哎,它的这个长度,哎,这是一个,然后还得再加上一个什么呢,就是我们这个now值的它的一个标识。哎,标十诶这样才可以啊,所以呢,我们凑到一起呢,就是六五五三五行,那我们在呢,CTRLC一下,然我再复制一份,我把这个呢改成叫DEMO1,那比如说我们这个字段呢,咱们后边呢,补一个约束啊,我就叫做这个闹闹啊,补上这个约束以后呢,意味着我们是不是就不是一个no了,那我们就不用考虑它的一个长度了,所以这种场景下呢,我就可以大胆的把它再加上一个一啊6533来,你看我们再走起。好,大家看是不是我们又创建成功了,哎,这就是极限了啊极限了你就不能再去夸张了啊,你比如我们这块我再改成是一个二这个你想改成6534,哎,那这块那就不行了,哎,走起。看是不是又报错了,行这块呢,我们给大家演示的是不是就是一个极限情况呀,哎,65533啊6532这个呢,我们就解释清楚了。好,那解释清楚以后呢,咱们再回来去说咱们说了啊,说什么呢,一个页它的最大的大小呢,是不是就16KB啊。
07:09
那一个页最大大小16KB,我们把它转换成字节的话呢,就是16384啊,这个你在这算一下也行,听一下啊,16KB啊,乘以是不是10224,哎,等于是不是叫16384字节,那好,那就相当于我们一个页啊。咱们最多呢,你可你你满打满算去存数据的话呢,只能存储16384个字节,但是现在呢,我们这一个字段呢,是不是就能最多给你干去6535个字节啊,你比一下看谁大呀,是不是显然是我们这个字段的这个长度有点大呀,言外之意呢,我们这一个字段,你这一个页啊,是不是都搞不定啊。诶,那就相当于我们这个表中,如果我只存这个字段,咱别的都不说,光说这个真实数据的话呢,现在你就存不下,那怎么办呢?是不是就会导致一个现象叫做行溢出啊,诶这个行的数据呢,溢出到我们这个页之外了,那怎么办呢?我们就要考虑这个数据的一个存储了,那怎么存呢?这里边儿就提到了,咱们在这个compact和这个redundant啊,这样的两种行格式当中。
08:09
他们怎么处理啊,哎,他们这样来处理啊,这样来处理就是这个对于占用存储空间非常大的这个列啊,在记录的这个真实数据处啊,只会存储该列中的一部分数据,咱们只放一部分,把剩余的数据啊,咱们存储在其他的几个页当中啊,进行的叫什么叫分页存储。啊,分页存储啊,你比如说我们这块的话呢,通常情况下啊,比如我们这个compac的话呢,它这块呢,一般呢,就放768个字节,那么你剩下的我存不下的呢,诶我呢就放在其他的页当中去存了,那么这块呢,一般我们会用20个字节呢,来表示你指向的其他这个页中的这个地址,当然也包括呢,你在那个页中到底存了多少,这个占用了多少次结束啊也会做一个记录。哎,就说白了啊,就是我们只存一部,只存一部分,剩下这部分呢,放到别的页中去存。
09:01
啊,这个呢,我想已经说清楚了,好,这就我们称为呢叫行溢出,就这种情况下呢,是会存在的。那么好了,咱们接着回过来说这个dynamic和这个compress的啊,这张我们就好说了,嗯,那么这两种行格式啊,整体上来讲,跟我们这个comp派的这个格式啊,基本上是一致的,只是说呢,他在处理这个行溢出方面啊,是有这个分歧的。啊,什么分歧呢?呃,这里边我们提到这个,呃,Dynamic跟这个compress这方面呢,它俩是一样的啊,他俩一旦遇到这个溢出的数据以后。啊,这个我们看这啊。这个他俩是吧,这个对于比如说存放这个lob中这个数据呢,它采用的叫完全的行溢出的方式,就是说呢,我们现在这个数据呢,你要溢出了,它并没有说在呃原有的这个真实数据这块先存一部分啊768个是吧,然后剩下的转到别的页中,不是他是直接呢,你这个数据全部都啊溢出到其他的业中。存储该字段全部数据的溢出页,然后在我们这儿呢,只记录一下你的地址。
10:02
哎,这个呢,就是跟咱们这个compact和redundant啊,它两个的这个区别。好,我应该说的比较清楚了。啊,就说到这儿,而我们这两个,呃,咱们说8.0里边默认的叫dynamic啊,这个compress的呢,跟这个dynamic它俩区别在哪呢?你看这个单词的意思就知道了,是不是叫被压缩的呀,那言G呢,就是我们这个compress这种格式呢,在咱们这个dynamic基础之上呢,它又使用了叫这种算法进行压缩处理,使得呢,像我们这个blob test work这种,如果长度比较大的话呢,它这个存储空间呢,就更加的有效。哎,区别呢,就在这儿。好,这个呢,我们就解释清楚了。那么关于呢,我们说的dynamic和这个这种行格式啊,咱们就说完了啊,那么这里呢,咱们,呃,整体上是以这个这种行格式呢为一个细节讲解的,讲解完以后的话呢,我们说了一下这个dynamic跟comp呢,跟这个comp它们的区别是吧?诶这块呢,说的就算是比较清楚的,大体上的话呢,还都是一样的,然后呢,我们还剩一种行格式叫做redundant啊,这个翻译过来呢,叫做冗余的啊,那这个行格式呢,跟前面这有什么区别,为什么叫冗余的呢?来咱们看一看这里边的一个区别。
11:11
呃,首先呢,我们提到这个瑞do呢,它是咱们麦斯和5.0版本,之前这个英诺DB呢,它的这个格式的行记录的一个存储方式就比较早了啊,那么现在的话呢,我们还兼容它兼容的目的的话呢,就是为了这个跟我们以前的版本呢做一个兼容啊,比如说呢,我们去修改这个表,然后把它的这个这个肉啊format改成这个redundant啊,还是可以的,没有报错啊,说明我们还兼容了之前这种版本,那么这种行格式呢,它的这个信息记录啊,咱们会发现呢,跟这个compac呢,你看就不一样了,对吧。这个也是分成两部分啊,一个呢,就要记录的这个真实数据啊,这个不用多说了,还有呢,就要记录的额外信息,这个额外信息的话呢,你一对比发现呢,它呢少了一个啊,我们这块呢,是不是有三个呀?呃,记录头信息这个都有,然后呢,前面这个呢,叫字段长度偏移列表,那你看我们这个呢,叫变长字段长度列表,哎,有什么区别啊。
12:07
区别就在于我们这个位置是不是多了一个叫变长,然后这个呢,没有变长了,这个多了一个偏移是吧?哎,所以主要区别呢,就在这儿,然后正因为这里边儿存在这样一个区别呢,所以呢,使得呢,我们就诶不需要呢再去提供这个叫not纸列表了,而我们这个里边呢,需要提供一个not纸列表。哎,那有同学说呢,说老师你这不是说反了,是不是上边这个应叫冗余的,你看上边多吗?下边这个少,那下边是不是不是冗余的啊,不对的是下边这个冗余啊,因为上边这个呢,我们如果说这个变长的,我们单独记录一下,不不是变长那个我们就不记录了,对吧?那你这个呢,是不是意味着就都记录啊,都记录它不就有冗有冗余吗。诶就这样一个情况啊,诶这个呢就解释清楚了,行,那么具体的来讲的话呢,我们这个偏移列表呢,它其实也是一个逆序排放的,呃,就是倒着去放这个长度啊,跟我们这个呢是一样的啊这个呢没有变化,那么有变化的来我们看一看这里边儿提到的点。
13:02
字段长度平行列表是吧?啊,这里边呢,我们说少了一个叫变长啊,那么re,行格式呢,会把该条记录中所有的列啊,包括这个隐藏列的长度信息都按照逆序存储到我们这个长度,哎,字段长度偏移列表当中,诶你看这里边呢,就会存在一定的这个冗余啊,一定的这个冗余的这个情况啊,你比如说呢,咱们讲这个compress这种行格式的时候。呃,咱们在哪块造了一个表的数据啊,啊在这块吧,你比如说这里边呢,你看咱们这个是十十十十是吧,诶这个呢,我们存储这三个字段的时候呢,咱们需要了记录一下真实呢,到底放了几个,像这种字段的话呢,其实就没有必要记录了,因为呢,它一定是实的,那你要在这里边还去记录,那岂不是就是多了一个冗余的一个情况嘛,哎,所以呢,这块呢是说它叫冗余的。所以我们才去改进对吧,那么第二个呢,它多了一个偏移两个字,这就意味着呢,它的计算这个列值长度的方式啊,不像我们肯派的这种方式那么直观,诶肯派的方式怎么就直观了呀,咱们就直接记录的时候呢啊,比如我们这个长度列表里边你存了几个,那我们这块记录的就是几,诶你看零六啊0408直接呢,就相当于指明我们这存了六个,这存了四个,这存了八个,是不是就很简单直观对吧?而我们这儿呢,就不这样玩,那他怎么玩的呢?举个例子。
14:21
比如说我们第一条记录呢,记录的这个啊,第一条记录啊,它的这个长度的偏移列表呢,是这样写的,这就偏移列表,就是你第一条记录呢,这个第一个字段呢,是在这放的,第二字段呢在这块放,第三个字段在这放,每一个字段呢都有记录啊,那么我们这个肉ID啊,就是我们所说的这个,呃。这个跟我们隐藏的这样的一个列了对吧,那么它的这个值呢,是呃,0X06啊,这不咱们逆序以后啊这样子的,哎,这个是零六。啊,这是零六,呃零六的话呢,呃,这就表示它的这个是占用的六个字节的意思,好,因为它是第一个嘛,然后接下来的话呢,就要传30ID啊,我们用0C呢去减去这个零六,减完以后的话呢,也是六个字节,你看咱们相当于是后边减前边这个,减完之后得到的这个数呢,才是你实打实的占用的这个字节数,而我们怎么着啊,咱们这个呃变长字段的长度列表的时候呢,咱们就直接写的是后边这个数,所以简单直观。
15:18
对吧,哎,就可以了啊,就是这样的区别,那么为什么说我们这里边就没有这个not值列表了呢?因为你所有的都表示了呀,我就没有必要呢,是不是专门再记录一下哪些是not值的呀。啊,就是这样个场景啊,这样个场景行,呃,这个呢,我们就说清楚这个事儿了,然后呢,还有这个区别就是在我们这个记录头这块啊,记录头信息这块啊,有个区别就是我们这个reundant呢,行格式呢,记录头信息占用六个字节,你看这是六个值五个,那你这个呢,是不是又多一点,感觉就是冗余了,对吧?诶那这六个呢,相较于我们这个compac的话呢,它有这个区别,主要是两处,一个呢是这个redund呢,这行格式里边多了两个,一个叫fuse,一个呢叫one of flag是吧,多了这两个字段,呃,另外呢,就是在我们这redundant里边,它没有这个关于record type这样个属性啊,我们这里边不是有这样个呃record type属性是吧?
16:09
行,那么这里边呢,关于这个field和我们这个one bit of flag啊呃,Off是吧,Flag这块呢,其实我就不是太想详细的去给大家去讲解了啊,那其实这呢,也作为我们比较老的这种格式呢,咱也没有必要呢,大家去这个深究了啊,那么大家有兴趣的话呢,你下来呢,再看看我这边描述就行,我就不在这块呢去展开来说明了啊,大家正常去看应该我觉得能看得懂啊,除了我们以上说明的这个区别之外。啊,涉及到了就是第一个这个位置,然后not列表呢没有了,然后记录头信息里边呢,有个区别啊,这个不能是有一个区别了,是不是就有我们这里边这两条区别对吧?除此之外呢,其他的场景跟我们这个呃,这个compac呢,呃,基本上都是一致的,所以大家呢,再去了解我们整个这个行格式的时候呢,还是以这个comp为主,然后呢,在这个基础之上呢,大家再去关注我们这个dynamic啊,再关注一下我们这个压缩以后的这个compress就可以了,这个呢,基本上大家就可以忽略掉。
17:06
啊,OK行,那么我们关于这个行格式的这个说明啊,咱们就告一段落啊,那么咱们这一章的这个重点的两个内容啊,咱们就算是给大家交代完成了。
我来说两句