00:00
好,同学们,咱们接着来看一下这个第七章啊,叫做in DB的数据存储结构,好,那么在上一章里边啊,咱们重点讲解的就是索引的底层的这个数据结构,呃,咱们以这个,呃,印度DB和MY为例的话呢,底层使用的都是毕加数,对吧?那么毕加数的话呢,它的每一个节点咱们都起个名字呢,是不是叫做数据页了啊,那你要这个扉页的节点,咱们也可以叫做目录页啊,其实本质上来讲呢,也叫做这个哎,数据页了,行,那么这一章呢,咱们重点呢,就来谈一谈这个页的结构啊,以及呢,这个页内部的呢,像我们提到这个行格式啊,这样的这个内容的细节是什么啊,这呢,就咱们这一章呢,要提到这个存储结构的问题啊,那首先呢,我们来看一下这个引入。说这个索引结构啊,给我们提供了高效的这个索引方式啊,不过这个索引信息以及我们的这个数据记录啊,它都存储在这个文件上的啊,对吧,你比如我们这个印度DB的话呢,是不是索引跟我们这个数据呢,都存储在叫ID格式的文件里啊,你要这个MY的话呢,它存储在这个MY啊,以及呢,我们这个D是吧?啊,一个呢是索引文件,一个是我们这个数据文件啊,都放这文件里了,那我们从这个B加的结构上来看的话呢,索引也好,数据也好啊,当然这块我们主要谈的是这个应对DB了啊,哎,是不是存储在都是我们这个页结构当中啊,对应的就是我们B加数里边的一个一个的节点。
01:17
OK,然后另外一方面呢,这个索引呢,它是在这个存储引擎当中实现的,咱们上一章呢,也重点去说了,只要呢,你提这个索引底层的这个结构,一定要说清楚是在什么引擎当中啊,你比如说我们在这个memory当中的话呢,它这个索引是不是默认的就是哈希索引了,对吧?哎,这个你得说清楚是哪个引擎里的。啊,这个引擎呢,就是负责我们这个表当中数据的一个读取和写入工作的。这里边呢,提到一点就是这个引擎不同啊,它这个存放的格式啊也是不一样的啊,咱们也看到了DB啊,MY里边啊,它底层存放文件的格式不都不同嘛,对吧?诶甚至呢,你像夸张一点的,我们的memory是内存级别的一个存储引擎,它连磁盘呢都不用啊,那更无从谈及说这个文件系统里边的这个文件了,对吧?好,那基于这样的一个点的话呢,我们说现在呢,咱们要谈这个页的这个结构啊,咱们得做一个明确,你得说清楚是不是哪一个存储引擎啊。
02:10
啊,自然而然的应该是得这样的,对吧,那我们这里边呢,重点要讲解的就是印度DB啊为什么呢,那毫无疑问,印度DB呢,是我们麦目前像五点之后的默认的存储引擎,所以呢,咱们要讲呢,主要就讲它了。啊,就跟着大家你想学习Java里边呢,那对应的是不是有一个技术叫做GM对吧,那这GM当中的话呢,具体落地涉及到很多的这个虚拟机,那我们应该讲哪一个呢?是吧?包括这个虚拟机的这个标准呢,随着GDK版本的增加呢,它这个标准又不一样,那这个呢,我们得捋出一条主线来,那怎么办呢?诶这个主线呢,就是我们以呃,这个原来叫S公司了啊,现在叫Oracle公司是吧?呃,因为S公司被Oracle给收购了啊,就是现在呢,Oracle拥有Java的这个整体的版权了,那那我们就以这个官方他自己发布的这个叫house虚拟机为主。对吧,哎,那你就看人家这个就行了。OK,那就包括呢,这个垃圾回收器啊,他现在用什么呢?他用g first,那咱们这块要讲呢,主要就讲这个g first是吧?诶那这个呢,诶回到这块呢,就是默认的存储引擎的是用DB,那由于大家呢,普通引擎放的又不一样,那我们学谁呢?那当然呢,先来学这个印度DB了啊,那学完度DB还有没有必要看其他这个存储引擎呢?啊其实呢,也就没有必要了啊,因为呢,首先呢,基本上我们使用的呃这个诺DB的场景是比较多的。
03:24
对吧,这是其一,那其二的话呢,就是咱们在这个呃,优化这个层面啊,像这种高并发的层面呢,那用的也是它,呃,其他的这个场景的话呢,咱们就不用关注的那么细致了。啊,不用的那么细致了啊啊,因为这块呢,我们讲解其实已经是很到这个底层了,哎,大家呢,就是已经揪到这个层次呢,就已经是比较深了啊,没有必要咱也不是说呢去在企业当中去开发这个存储引擎的,所以你就没有必要呢,呃,非得磕的那么细致了,OK好,我们重点呢,就是还讲到我们这个印度DB啊就OK啊用户大家面试的话,那绝对是绰绰有余了啊。行,那这块呢,我们就来谈这个英度DB啊,首先呢,提到了磁盘和内存交互的基本单位呢,聚到页了,说英DB呢,把这个数据呢,划分为若干的页啊,印度TB的这个页的默认大小呢,就是16KB,这个呢,咱们前面也提到过,这呢算是咱们正式的提到说这个页的诶,默认大小是16KB。
04:19
好,那这个16KB的话呢,咱们也可以通过一个指令呢,去做一个验证啊,就是我这里边提到了一个变量叫DB的page size啊,是16KB的,那我们也可以做一个查看啊,比如说我们首先呢,登录一下咱们的MYSQL这个服务器啊。呃,150机器上的这个ma8.0啊,160上的是这个5.7,这块我们都登录一下,好,那么在这个8.0当中,我们去演示吧,啊这块跟5.7呢,其实是一样子的,这块我们首先登录一下啊UC2好录成功,那那这块我们把这个呢,呃受s DB size呢,可打出来一回车,那这块呢,我们就看到是16KB。啊,是没有问题的,行,再回来。那这块我们先穿插一个啊说呢,我们在这个MY当中呢,是16KB,那在其他这些数据库当中也有这个对应的这个页的概念,它的大小呢就不太一样了,比如说s server当中呢,它这个页的大小呢是8KB。
05:13
啊,比我们这个呢,相当于少一倍对吧,在Oracle里边呢,它用另外一个词叫做block呢,去替代我们这里边儿这个页啊,实际上呢,是一个意思啊,那么Oracle当这个块的大小呢,分别呢,有2KB 4KB 8KB 16 32 64啊都是二的这个整数倍啊这个相当于它会更灵活一些,对吧?OK,行,那我们这块呢,再拉回来啊,那这块呢,提到了说一呢,作为磁盘和内存之间交互的一个基本单位。哎,大家明白什么叫基本单位吗?啊,就相当于我们只要涉及到他们之间交互的话呢,一定你得说啊,交互了多少多少个页,这个呢是一个整数,你不能说带小数点。啊,你比如说呢,咱们说生物吧,生物的最基本的单位呢,咱们说是不是叫细胞啊,啊,就是基本单位,它首先不等于于说叫最小单位,你说这个细胞是最小单位呢?单位嘛,不是那细胞还有细胞核,细胞壁是吧,还有这个线粒体啊等等这样的一些结构,你不能说它是最小单位,但是呢,你说一个生物它有多少个细胞构成的,是不是一定得是一个整数啊,你不能最后带个点几,呃,各细胞,那细胞还能分一半吗?不可能的。
06:18
对吧,哎,那么基本单位呢,就是你得至少是它的一个整数倍的啊这样的一个场景。包括呢,我们说这个化学当中,咱们提到这个物质的话呢,都是由这个分子,分子你倒是还可以细分叫原子对吧?那我们说原子呢,是这个物质的一个基本单位了啊,还有可能是生物,也可能不一定是生物啊,这就是呃,基本单位叫原子啊,但是你不能说原子是最小单位,因为原子还有原子核呢,对吧?啊,还有中子,还有电子呢,哎,不能那样讲,但是它得是一个基本单位,也就是说呢,我们一提到一个物质的话呢,一定涉及到是多少多少个原子,你不能把这原子呢再砍一半,对吧,那就不合适了。那回到我们这儿也是一样,我们既然呢,页作为磁盘和内存的基本单位,那就意味着比如我们这儿呢,就是这个磁盘,我就简单这样一块,这个呢,就是我们说的这个内存,现在呢,我们需要呢,把这个数据从磁盘上呢加载到这个内存当中,那一定呢,是不是说加载了多少多少个页啊,这个时候呢,是不是一定是一个整数,你不能说几点几个页啊,那就不合适了。
07:15
啊,这是一个另外一个的话呢,就是我们把这个内存中的这个数据啊,你要是把它呢,在回写到啊,这个其实叫刷盘操作啊,啊到我们这个磁盘中的话呢,也得是多少多少个页啊,以整数为单位,你不能说呢,刷了一半个页,那也不可以。真实当中呢,很有可能真的刷了一半,刷了一半呢,导致,呃,后期我们这个MY,比如说宕机了,导致呢,那一半没刷出去啊,这个还是一个麻烦事,我们还得需要通过,比如说你是锐度日日啊,还是安度日啊,我们该回滚还得回滚是吧?哎得这样去处理才行,保证呢,我们一定呢,哎刷盘的话,你是一个页的一个整数倍啊才可以的啊,这就我们说的这个概念啊,那这时候呢,可能有同学会想说,老师呢,你比如我们内存当中有一个页,这个页里边呢,我只改了这个页中的一条记录,那我们这条记录呢,去刷盘到这个磁盘中的时候呢,我们也要把整个这页的数据呢全刷出去嘛。
08:06
啊,你说对了啊,就得是这样去做,这才体现它叫基本单位。啊,那你说我只把这一条数据刷一下行不行啊,哎,不行啊,不能这样去做啊,你看似呢,说我们这样刷着一条数据,似乎呢说工作量会更小一些,其实呢,你殊不知我们要修改的时候呢,有可能你改了是很多条记录,那很多条记录呢,如果每改一条记录,我们就刷一次这个盘的话呢,你想想我们跟磁盘的交互次数那得多多呀。相当于呢,就是我们还不如这个用数叶为基本单位,在传输的时候呢,这个IO次数少。哎,这里边儿我们还要注重一个非常重要的事儿,就是IOIO花的时间呢,还是比较长的。啊,所以呢,你不能以这个一条数据为基本单位去阐述啊,效率很低是吧,你看这块我也写这个问题了。好,那说了这么多呢,大家要明确一下我们这个基本单位啊,是一个什么概念。好,那这块呢,就是接着呢罗列出来了一下,就是我们上一章当中提到的就是这个B加数啊,这个呢,大家你一看呢,应该能知道我写的呢,是一个B加树的叶子节点。
09:08
啊,叶子节点就是因为我们这里边放的就是一条一条的这个表的记录了,只不过这里边儿我是横着放的,咱们在上一章讲的那个毕加数叶子节点的时候呢,我是竖着是不是放的一条一条的记录啊,这呢,我放成这个横的放了啊,这个可能稍微有点不习惯啊,但是整个这个结构呢,还是一个叶子节点。好,那么这里的话呢,我们再稍微的呃,算是一个复习了啊,简单的把我们整个这个结构呢,再给大家串一下,大家呢也要能够用自己的语言去做一个描述啊,就是把这个图呢给你之后呢,你能不能把他呢看到的信息描述出来,好下边呢,我开始来说明。那么首先的话呢,我们提到了这是呃,说了基本单位了,叫做这个数据页了,那么这个数据页的话呢,是16KB为这个它的默认大小的,那如果说呢,我们在磁盘上啊,涉及到这个存储这个表中的记录呢,量非常大了啊,这个百万条上千万条这个数据,那我们自然而然的涉及到这个数据呢,是不是就会更多一些,首先的一个问题就是这个数据之间,它们是不是物理上的一个连续空间啊,这边我们要说到呢,不一定。
10:09
啊,因为呢,你要是很多的数据的话呢,我们物理磁盘上不一定能够给你是不是恰好分配这么多的连续空间呀?啊那怎么办呢?诶我们呢,只需要呢,让这个页跟页之间啊,用这种双向链表的方式呢,进行一个连接就可以了。啊,这样的话呢,让咱们实现一个逻辑上是一个连接的啊,就OK,那这里边儿的一个指针啊,就是咱们在上一章中也提到的点,那么具体来讲,它是在哪个变量中记录的呢?那就得是咱们讲这个页的内部结构了。啊,讲这页的内部结构啊,它在这个前面这块呢,就呃存着的相应的这个变量啊,去记录它的下一页是谁,它的上一页是谁。OK啊,这呢是我们说的这个大方向的一个概念啊,你包括呢,我们这个页呢,你看这个页A,这页B是不是就相当于页的一个编号啊,啊也在我们这个,诶相当于头部这个里边呢,做了一个记录。好,那么然后呢,我们再看具体这个,呃,页内部的话呢,一条一条的记录,那么每一条记录这块呢,你会发现呢,他们,呃先说页记录记录之间吧,记录之间的话呢,你看它是一个单向列表的结构,对吧?那就意味着我们这个记录里边是不是一定会有这样的一个变量来记录一下它的下一条,呃,数据是谁对吧?诶那么这呢,就提到了我们这个行格式的问题了。
11:20
诶,咱们在上一章当中呢,只是默认呢,提到了一个行格式呢,是用的compac是吧,那这一章呢,我们就具体来讲解一下这个行格式啊,准确来说呢,主要是在这个记录头里边呢,来记录一下我们这个指针的。好,那么这里边儿那个记录呢,实际上呢,是不是也是有一定的顺序啊,如果说我们这是一个句促缩引。啊,应该懂我要说什么,就是这儿呢,真的是一条完整的记录了,如果要是非技术索引的话呢,我们最后这块呢,叶子节点是不是只记录你当前,呃,就是你以谁为这个哪个字段为索引的这个字段,还有我们这个主键的这个字段。那是不是只有这个信息了,就啊这就不是你完整的这个记录了啊,那要是完整记录的话呢,那就一定是一个居促索引了,那我们通常呢,是不是都是以这个主见啊来进行这个句子索引的一个创建了,然后这时候呢,呃,是不是都按照我们这个主键是一个递增的一个顺序进行排列的吧。
12:11
哎,是没问题的好。啊,那这个呢,指针就依次这样去指向,还有呢,就提到了一个最小记录和最大记录,这个呢,就是我们页里边这个结构啊,咱们在这块呢,提页内部结构的时候呢,这不有一个最小最大记录吗?哎,就是对应的是这两个概念。啊,这两个概念行,那这个呢,页内部呢,基本的情况我们就先说到这儿,然后的话呢,我们在进行数据查找的时候,比如说我现在要查找一个,嗯,假设你这个主键啊,恰好就等个值,然后咱们就走那个B加数那个结构是吧,一层的往下假设呢,就走到最后这一层,我们判断了,发现它在1A当中。那么接下来的话呢,诶知道是在E当中呢,我们再去找的时候,假设呢,这个页当中咱们存储了这个1000条记录。啊,然后我们现在要找呢,是不是找其中的某一条了,那么问大家我们该如何去找呢?啊,这里边儿呢,是不是就涉及到了一个问题,就是再去找的话呢,针对于我们这个单列表这种结构,大家学习数据结构的话呢,应该有这样一个概念,单列表这种结构的一个特点呢,就是它对于数据的一个删除和插入操作呢,效率是比较高的啊,比如这个指针不要了,我们插入一个效率比较高,不用涉及到呢这个,呃,移位这样的一些行为,对吧?但是呢,这种单列表的特点呢,或者叫缺点呢,是查找比较慢。
13:26
我们如果呢,要找这个单列表中的一个数据呢,是不是它就只能是从头开始一个一个的这样去找了,所以说呢,它的复杂度呢,就是on级别的。啊是O级别的啊,那这里边儿,比如我们现在呢,想找一条记录在这1000条里边看看在哪,那你要是这个单列表的话呢,一条条去找这这个显然就比较慢了,那怎么办呢?这呢,我们又提到另外一个概念叫做哎页目录。对吧,哎叫这个页目录,这个页目录的话呢,咱们在上周提到过啊,就是我们针对这1000条记录呢,咱们构建一个目录,那这个目录里边呢,咱们先泛泛的这样去说啊,就记录了你这里边这个呃这个这个每一条记录呢,呃,其实不是每一条记录啊,它这里边涉及到一个分组的概念了,细节呢,咱们到时候再讲,你就先大概知道了,就是我们针对这一条记录呢,1000条记录呢,这块做了一个目录了,这个呢就是一个升序的,然后呢,这其实是一个呃数组的一个结构了,那数组这个结构的特点呢,我们是不是就可以呢?是诶二分法来做了,先找到中间这个啊,比这个数呢小,那就去左边接着找,比这个数大,那就要去右边去找,每次呢,相当于砍一半,所以呢,它的这个复杂度呢,是不是就变成这个叫LOG12VDN的对数这个复杂度了,那这个呢,显然是不是比我们这样的方式去顺序查找要快很多。
14:37
对吧,诶这个呢,就提到这个二分法,诶它依赖的结构呢,就是我们叫页目录,哎,咱们在讲这个页内部结构的时候呢,会提到它相当于呢,就是咱们讲上一章的时候啊,呃,有很多这个东西啊,咱们都提到过了,但是呢,没有具体的去说它是在哪个变量当中去做的记录,以及呢,除了这个之外呢,还有哪些东西,那么咱们这一章呢,就重点的来讲一下这个事儿。
15:00
包括呢,就是我们针对这一行记录,这一行记录的话呢,除了我们说的这个用户声明的这个表中的一行记录中的这个字段之外呢,还有哪些额外的信息呢?呃,这个呢,也是我们这章要给大家呢去讲解和剖析的。啊,OK,行,这是我们说的这个事儿,然后的话呢,我们再看一下这个year的叫上层结构啊,叶呢是我们说叫作为基本单位,但是没有说它是一个你能够看到的最大的单位,就跟说一个生物的话呢,我们说这个基本单位是细胞对吧,但是没有说呢,细胞上面就没有别的概念了,最起码呢,是不是还有个器官的概念呀?啊,那我们这里边就要看一看这个叶上面呢,都有哪些概念呢?这呢有一张图。啊,这呢,页就在我们这个正对的这个方向上,页里边呢,就是一行一行的数据啊,这个呢,涉及到这个行的就是行格式了,OK,那么页的上一层概念呢,叫做区。哎,叫做这个区的概念,那么一个111个区的话呢,哎是能够存放64个页的,这也是一个默认的行为,那么64呢,乘以16啊,一个一是16KB,结果呢,正好是1024KB啊,那就是一兆,相当于我们一个区的大小呢,就是一兆的空间。
16:10
啊,这个就清楚了,然后区的这个上层概念呢,叫做段啊,叫做这个段,然后段的话呢,这里边儿提到了,它是数据库中的分配的一个单位。诶同学懵了,诶这怎么又成叫分配单位了呢?哎,那就相当于呢,我们分配的话呢,都是一个段一个段分配,按什么标准来分呢?我们提到说不同类型的数据库对象啊,诶有不同的一个段这个形式存在,你比如说我们创建了一张表,我们就创建一个叫表段,你要创建一个索引呢,我们就给你创建一个叫做索引段,诶是以这个数据库对象的这个不同呢来进行的一个区分。啊,这个呢就明白了,他这是影响我们这个对象在分配的时候呢,它的一个单位啊,就是段是吧,作为这个分配的一个基本单位了。好,那么这个段的上面呢,我们再提到一个概念呢,叫做表空间的概念啊,它是一个逻辑上的一个容器啊,那一说到这个表空间呢,咱们在前面的话呢,是不是提到过这个表空间啊,啊在哪讲过,我们是不是在第二章当中提到了啊这呢,其实我们就把这个前面这几章内容啊,咱们就能够连成一片了。
17:12
好,你看咱们在讲这个第二章的时候呢,提到过这叫独立表空间和这个呃,系统表空间啊,当时呢,我们提到说这个数据信息表中的这个数据啊,我们就可以把它存放在叫I塔一当中,这个还记得在哪了吗?那就可能有点懵,都忘了是吧,哎,我这块呢,再生成一份。看一下嗯,这块的话呢,我们需要进入这个叫数据目录了啊CD一下,然后y Li叫my circle对吧,然后I一下,然后这呢,就是我们这个数据目录,这个数据目录里边呢,它有一个这个结构是不是叫呃ipd塔一啊哎我们把它呢就称为呢叫做哎系统表空间。嗯,在咱们这个JDK应该是五点六点几那个版本之前是吧,咱们这个第六第二章这个课件里边都写着呢啊,诶咱们看一下。嗯,这个是在上面讲的。
18:01
I塔一,这么着吧,CTRLC一下,CTRLF。哎,这样我们搜索一下。嗯。诶在这呢是吧,写的说那个5.5.7~5.6.6啊之间的各个版本,我们表中的数据呢,默认都放在这个系统表空间里边啊,就是相当于我们表中的数据啊,咱们是可以放在这里边的啊,那么在这个版本之后的话呢。呃,在这个版本之后的话呢,咱们默认的是不是就放到这个叫独立表空间里了,独立表空间呢,就对应的我们叫ID啊,这个格式的文件,这个我们称为呢叫独立表空间啊,那么相当于呢,咱们再回过来啊,这呢提到这个表空间的概念,这不也就涉及到我们能够接触到关于数据存储的一个最大的概念了,因为已经落地到是不是具体的磁盘中的一个实打实的一个文件上了啊,这是它,然后你在这个DB test1里边是不是就能看到具体表涉及到的那个独立表空间了啊,比如我们的CD。啊,DB台词一啊,在这里边呢,我们是不是就看到这个叫IB是吧,是不是ibd是吧,这样格式的文件了。
19:02
啊,这叫独立表空间,这呢就是我们目前能够接触到关于数据存储的一个最大的概念了,啊这个表空间的话呢,具体又划分成不同的这种表空间的这个类型是吧?啊这个我们到下边呢,讲解到这个的时候呢,咱再说那这一章的这个重点的话呢,其实是两个,一个呢就是来讲这个页的内部结构,一个呢就是来讲我们这个行格式。啊,把这两块呢,大家弄清楚了,对于啊,你要说应付面试,那简直是绰绰有余了啊,这个在实际开发当中,我们讲这两块内容的一个意义呢,是为我们还是啊为了后期的这个优化呢,它实际上是提供一个这个这个帮助是吧,相当于底层这个事儿呢,你是非常扎实的。啊,那至于说呢,我们像这个这个区段,呃,包括我们这个像表空间这儿呢,我就没有大篇幅的去展开讲解里边的这个设计的原理了,因为呢,毕竟大家也不是在公司当中需要去设计啊存储引擎吧,啊,也不需要你去开发一个新的存储引擎,对吧?啊这样的人呢,是微乎其微的,那我们就没有必要把这个重心呢放在这儿,那我们是不是应该放在后期优化上啊。
20:05
诶,所以这个我们重心呢,就不在这里放了,但是关于这个呃,行格式和我们这个页结构呢,内部结构呢,是有助于我们去理解这个毕加数的啊,理解毕加数呢,有助于我们理解索引,有助于我们去讲优化,所以这块呢,我们还是要展开去讲一讲的,行,那这呢就是咱们先说一个概述。
我来说两句