00:00
好,同学们,咱们关于呢,In周DB这个行格式啊,或者也叫做记录格式,以及呢,这个页的内部结构啊,咱们就告一段落了,呃,下来的话呢,大家再去熟悉熟悉它呢,对于咱们去理解这个B加数的结构啊呃,以及呢,我们后边呢如何呢?呃,使用这个索引呢,进行数据的优化呢,是非常有帮助的啊,熟悉一下好,那么回过来啊,咱们再来看一下这一章当中的剩下的这几个内容啊,我们呢,还是从这个最初的这个出发,我们提到这个页呢和这个行格式的时候呢,它应该算是我们在讲这个底层数据在存储的时候呢,比较小的这个单位了,在这个页当中,咱们是放的一行一行的数据,那咱们称为的叫行,这个对应的叫呃行格式是吧,那么这个页的话呢,是不是又存放在我们这个区当中,区呢,又放在这个段当中,段呢,是不是又有我们逻辑上的一个概念,叫做表空间这样的这个概念存放,对吧?诶有这样的几个概念,那下边的话呢,我们就来讲解一下,为什么我们在这个区上,在这个页上边还要引入这个区段和。
01:00
表空间这样的概念。好,那首先的话呢,我们来给大家解决一个问题,就是说我们为什么呢,还需要有这个区。哎,还需要这个区诶首先呢,大家脑海当中浮现出来的呢,应该是我们磁盘和内存在进行数据交互的时候啊,或者我们叫IO的时候呢,咱们说呢,是以这个页呢为基本单位的啊,也可以说呢,是以这个页呢为最小单位的,对吧?那每次传出的时候呢,最起码你得是一个一个的页啊,就是得是一个整数,你不能说几点几个页,那就不靠谱了,对吧,是不对的,行,那以页为单位,那我们这块呢,传输的时候呢,也也也OK啊啊你比如说现在我们介绍这样一个需求,咱们想查找某一个范围的这个数据。比如说呢,我想查找这个呃某一个字段,比如这个C1吧,呃,希望查找它大于等于,比如说五,呃,小于等于这个30这个段中的数据,那我们对应的这个底层的话呢,比如这个B加数是吧,上面一层一层的到最下边这块是不是就一些存储我们真实记录的这些页了。
02:02
那么这些页的话呢,它有可能是不是在几个页当中,那页跟页之间呢,咱们说了它是一种双线列表的关系,那有可能我们查的数据呢,比如说在这三个页当中,那我们是不是就需要呢,从磁盘当中啊,前提呢是我们内存中也没有缓存过这些页,咱们从磁盘当中呢,是不是就把这几个页呢?诶是不是加载到我们这个内存当中就可以了呀?诶就没有问题对吧?那这里边我们提到一个点,就说页跟页之间啊,它是这种双向列表的关系,那咱们在讲这个页的这个内部结构的时候呢,不是也提到了,是不是提到了叫file header对吧?在我们这个file header当中呢,它保存了我们这个这个上下页这样的一个列表。OK,那么也就是说呢,我们实际当中就是按照咱目前的讲解哈,实际当中呢,说你这些页呢,有可能是在物理磁盘上,它的位置呢,离得非常远呀,那我们要加载这三个页,离得可能很远,那离得很远有什么问题呢?啊问题呢确实是有,因为呢,我们这个磁盘这个磁头呢,它在查找我们这个页的时候呢,它需要去做这个,比如说寻道啊,寻道需要花时间,比如半圈旋转啊都需要花时间,那么加载过来以后呢,我们再进行操作,这个时间呢,我们都在内存层面了啊花的呢就比较有限了,而且本身呢,你这个按照这个C字段呢构建呢,我们这样的一个。
03:15
呃,数的话呢,它本身也是一个递增的顺序,那再找起来就很快了,关键呢,就是我们在加载的时候呢,这几个页它物理磁盘上离的位置很远啊,那么我们把这种情况呢,就称为呢,叫做随机IO。叫做随机癌,这种随机癌的话呢,呃,它这个磁盘这个读写的速度啊,跟我们内存这个读写速度呢,差好几个数量级,是非常慢的,那我们建议呢,使用的叫做顺序L,呃,什么叫顺序L呢?也就是说我们刚才呢,想找这个C呢,它是在这个五跟这个30这个范围之内的,它对应呢,比如说我们有这样的三个页,说能不能考虑这三个页的话呢,咱们在物理磁盘上让他们呢,是挨着的,是连续存放的,那这样的话呢,我们再找起来就会减少比如说这个寻道啊和半圈旋转啊这样的时间,那我们加载速度呢,就会快很多。
04:05
啊,我这样一讲的话呢,很多同学如果没有接触过,像我们说这个计算机这个组成原理和操作系统的话呢,这个你可能对这个概念呢,呃,就没有什么这个触动是吧?嗯,那为了方便大家去理解呢,我这儿呢,又在附录里边呢,放了这样的一个内容,那咱们来看一看。比如说呢,我们现在呢,需要这个数据,那这个数据呢,假设我们是从数据库缓冲池当中呢来获取的,那这个数据呢,前提缓冲池中没有怎么办呢?如果在内存中有,我们把这个数据呢,就从内存中再加载到我们缓冲之中就可以了,这个时间的话呢,在一秒左右啊,应该说呢,效率是非常高的啊,就从内存当中我们去读数据啊,这个呢是一种情况,第二种情况呢,就提到这种叫随机读取数据的情况。啊,那如果数据呢,没有在内存中,我们就需要呢,在磁盘中对该页呢进行查找,那整体的一个预估的时间呢,是十毫秒,你看是我们这个的十倍。啊十毫秒,这十毫秒当中呢,我们再具体去划分啊,你会发现它有六毫秒呢,是磁盘的实际的忙碌时间,比如说这个寻道呢,和半圈旋转的这个时间,有三毫秒呢,是可能发生的这个排队时间啊,一个预估值,另外呢,还有一毫秒呢,它是这个传输的这个时间。
05:16
啊,把我们这个页呢,从这个磁盘服务器的缓冲区加载到我们这个数据库的这个缓冲区当中,啊,你会发现呢,这个1/10呢,才是我们所谓的真正加载这样的过程,其他这个时间呢,你看都浪费在我们去找这个数据上了。对吧,都去找这个数据上,这个呢是我们不希望看到的点,那我们呢,把它改写成这个顺序存储,也就是说我们在物理磁盘上呢,如果页跟页之间呢,是这种顺序存储的,那我们这时候呢,这个时间就可以大大的降低下来。啊,大大的降低下来,你看如果我们顺序存去读取一批数据的话呢,那我们比如说这个磁盘呢,它的存储量呢,是一秒钟呢,叫40兆。啊,一秒钟40兆,那么对于一个16KB的页的,呃,这个大小的页来讲呢,咱们一次性呢,就可以图取2560个页,那相当于你看我们40兆呢,是不是除以16KB,这一除大家就得到了是2560,相当于一秒钟呢,我们就可以读2560个页,那么这里边呢,就存在这样的一个关系,大家看一秒钟呢,我们对应的是不是叫1000毫秒啊,那么1000毫秒钟呢,我们可以读取2560个页,那我们就可以去除以一个2560,那么得到的结果呢,就是说咱们读取一个页只需要0.39啊,咱就0.4吧,只需要0.4毫秒。
06:35
读取一个页呢,只需要0.4毫秒,大家看一看是不是很夸张,我们从内存中读的话呢,还需要一毫秒,而我们这里边儿呢,诶平均下来的话呢,一个页只需要0.4毫秒啊,速度呢是非踌的啊,那0.4毫秒和我们这里边读一个页呢,是需要十毫秒,大家去比一下,你看看这个差距呢,是不是就极其明显的。好,那我们这个结论就来了,咱们希望呢,呃,比如说啊,再回到咱们这块,说到这个点上,我现在呢,想找一下这个C呢,它是在五到这个30啊,或者我们叫300吧,夸张一点,这个范围中的这个数据,它就有可能存放在不同的页当中,那我们去加载这些页的话呢,咱们刚才说了随机IO不太靠谱啊,一个叶十毫秒,那我们要是顺序IO的话呢,平均一个叶的话呢,只需要0.4毫秒,那我们尽量呢要顺序IO。
07:23
哎,那这呢,同学肯定会有疑问,说老师啊,这个咱们前面不是讲了说这个页啊,对吧?说这个页的话呢,呃,有可能我们这个表中的数据量很大很大的情况下呢,我们就需要很多的页,那很多的页呢,如果都在内存中去连续存储的话呢,那这块是不是也不太靠谱啊,我们这个物理磁盘能不能给我们保证说这么多页都一个一个挨着呀,诶当然了,不能保证啊,不能保证,所以当初咱们才说呢,让他们用这种逻辑上呃实现一个连续,用双元列表来表示是吧?那现在呢,我们怎么又提出说呃,让他又连续了呢?诶这块呢,咱们说不能够保证咱们所有的数据页呢,他们都是连续存放的,那我们至少可以保证一波。
08:03
哎,这个这一波是连续的啊,下一步呢是连续的,哎,就是相当于一个中间的一个概念。对吧?哎,那这时候呢,我们就引入了这个区的概念,咱们一个区的话呢,呃,让他呢,能够在物理上,哎物理磁盘这个物理空间上呢,能够有64个页,那一个页呢是16KB,那相当于我们一个区的话呢,相当于就是一兆的空间,那1IG呢,我们在磁盘上分配的时候呢,我就分配这是一个区一兆的空间,这里边呢能够放64个页,然后这呢又是一个区里边呢,又是64个页,那么这些这个页跟这个页之间,它们呢,你还是一个双向列表的方式呢,去连接他们呢,这个区和这个区可能物理上不是连续的了。啊,这个大家能明白对吧,你比如说我们现在再去查这个,呃,刚才说的这个五,呃C1是吧,在这个它到这个300之间,那很有可能我们这个范围查找,你像本身一个页当中,我们这个数据量呢,就可能这个几百条上千条对吧,那我们这当中放64个页,很有可能我们要找的数据呢,是不是就都在这一个区里了,那这时候呢,我们就可以使用叫顺序L,那这个时间的是不是就大大的降低了,比你原来的每个页之间呢,都是不连续的,这个要靠谱的多。
09:11
哎,这呢,就是我们引入区的这样的一个原因。啊,大家应该能理解我这个意思吧。诶,这就我们引入个区的原因,好,那我们刚才提到说这个区和这个区主,我这不是页了啊,这是区,这个区跟区之间呢,咱们可以呢,不是连续的,但是呢,如果我们一个表中的这个数据量啊,特别多的时候,你想表中数量特别多了,咱们甚至可以考虑让这个区和区之间也是挨着的,那么这样的话呢,你是不是在加载的时候呢,有区跟区之间都是这个顺序L了就更好了呀。诶对了啊就更好了,即使呢,我们这个让区跟区之间在连接的时候呢,有可能呃,有些区呢,这个数据还没有填上是吧,是空白的,会造成一点点空间的浪费,但是相较于我们这个顺序IO来讲的话呢,性能实在是太高了,所以呢,我们叫功大于过。
10:01
哎,OK,哎,这呢,我想已经说清楚了,好,那么区呢就说完了。大家觉得嗯,不错,还挺挺好是吧,那么下边我们又引入一个概念,说我们在这个区的概念上呢,再要引入一个概念呢,叫做段。哎,叫做这个段啊,那这时候呢,大家可能就有点迷茫,诶,怎么又整了个段儿呢?啊,等我讲完这块,包括碎片区以后呢,大家你会感叹啊,这个设计数据库的这些人真的是太妙了啊,这个如果大家你有这种拍案教学的感觉,那就说明呢,你读进去了啊,来吸收了我们这里边的精华。好,为什么要有段来咱们讲解啊,但是你看咱们刚才提到了,是不是我们说在这个区里边是不是就放我们这个叶呢,让这个叶之间呢,是不是说让他们就是呃这个连续的这个空间去存储,对吧?好,那么问题来了,比如说我们现在还是这个C1啊,我们让他找呢,是大于等于五,小于等于这个呃300吧。诶,我们现在要找的话呢,大家你想咱们其实关心的是不是就是这个B加数啊,我们简单再画一下这种B加数的结构,然后这个最后呢,我们就是真正的放的是这个数据的叶子节点,放的就是我们这个数据了,对吧?那么现在呢,咱们已经定位到这个C是五到300这个范围了,实际上咱们现在感兴趣的注意咱们感兴趣是不是只是下边的叶子节点中的这些页啊。
11:16
对吧,我们是不是感兴趣的这一页,那我问你这是一页吗。非叶子节点是不是也是叶啊,好,那问题来了,咱们现在这个区当中,咱们呢,放的是叶,哎,那么它就有可能是不是既放我们这个,呃,叶子节点的这些页,是不是也有可能放我们这个非叶子节点这些页啊。那就我们这些页呗,啊,目录页对吧?哎,那么这时候你想想,我们这个区里边呢,呃,既有这个数据页,又有这个目录页,但咱们感兴趣呢,只是数据页,那你这块呢,呃,因为都放,所以导致了我们这个数据页呢,可能就放的少了,那我们这个范围查找的时候,你有可能会发现这几个页还不够,是不是又得跳到另外一个区,另外一个区呢,可能跟他还不连续,这时候是不就不纯粹了呀。啊,那这时候我们希望怎么着呀?诶希望就是说,诶咱们呢,这个区就是专门放我们这个数据页,就是叶子节点的,而你这个区的话呢,你去放这个非叶子节点的那些页啊,那我们在查找,比如说五到300范围内的时候,我们就直接定位这个叶子节点,这个页是不是一串下去就行了,哎连续的IO是吧,哎,顺序IO,哎速度比较快,所以呢,这个时候我们就引入了逻辑上的一个概念啊,这个概念呢,我们叫做这个段啊,叫做这个段。
12:26
那么呢,我们就区分什么呀,呃,叶子节点和非叶子节点,咱把这个放叶子节点这个区呢,咱们就诶称为呢叫一个段,然后存放这个非叶子点这个区的这个,呃,这个数据呢,我们就成为另外一个段啊,一个呢叫叶子节点段,一个叫非叶子节点段,那一个段里边咱没说只有一个区,那有可能你是有好几个区对吧?啊有好几个区,然后里边呢,这个是物理磁盘上都是连续的这一波页啊64个。对吧,诶64个页,哎,那么我们在查找的时候呢,这个就更纯粹一些啊,非页的节点的话呢,我们专门给他分配啊,你要是多的话呢,就是几个区,然后每个区里边放的都是一个非页的节点的,这些页啊就更纯粹一些。
13:05
那就是这个概念啊,那么举一个生活中的例子呢,诶大家你看是不是可以这样的去做类比,哎,你比如说大家看到这个地图当中的话呢,诶咱们这呢,是一个小区,小区里边呢,是不是有一栋一栋的这个楼啊,那每一栋楼的话呢,我们可以看到呢,就是一个印。啊,那大家呢,你看物理上呢,是不是都是连续的是吧?哎,一个一个的页,呃,然后这个区的话呢,就好比是我们现在讲的这个区的概念,哎,就是这个区的概念,OK,哎,物理上呢,它都是连续的,对吧?那么你看这个疫情期间啊,尤其能够出现出来,呃,大家呢,你去这个这个这个这一块呢,出现这个疫情了,然后呢,大家要是这个,呃,这个这个比如出去的时候,比如北京某一个街道呢,出现这疫情了,那么其他的街道,因为北京比较大了啊,其他街道说不受影响,那大家呢,日常出行啊是没有关系的啊出现疫情的这些街道呢,就不行,所以呢,在疫情期间呢,咱们尤其强调了一个街道的概念。啊,如果不是疫情呢,我都甚至不知道,诶,我在北京住的这个这个小区到底是什么街道了哈,诶,那我这个疫情期间就知道了,那么这个街道的话呢,大家就可以看到是我们区上的一个段的概念。
14:08
对吧,诶区上了一个段的概念啊,你比如我在在叫龙,我所在的这个,呃,这个街道呢,叫龙泽园街道啊,那么这个龙泽园街道呢,它自然而然的是不是就管理的下属的很多个这个区是吧,很多个这个小区的概念。哎,那这呢,就是一个,哎这个叫什么?逻辑上的一个概念叫做一个街道。来负的这一片,那我们这里边这个段的话呢,就相当于这样的一个情况啊,有呢是专门来存放我们这个叶子节点的这些区啊,有的段呢,是专门创这个非叶子节点这些区啊,OK,那除此之外的话呢,还有其他的一些这个段,比如说有叫数据段啊,索引段和回影段啊,数据段呢,就我们说存放叶子节点的啊,索引段呢,就是存存放这个非叶子节点啊索引段我们后边讲到事物的时候呢,再说好。那么接下来我们提到啊,整个呢,我们提到这个概念啊页啊,这个这个这个这个行格式啊,包括我们这个区段啊,它呢都是由存储引擎啊自身来完成的,那么对于它的管理呢,也有我们这个存储引擎自身来完成就行啊,包括像DBA呢,都没有必要呢,再对它进行这个控制啊,这个修改啊,这样的行为了啊,一定程度上呢,就解放了我们DBA的这样的一些工作啊。
15:15
好,这块大家看这个段的话呢,它就是我们说一个呃,不对应的表空间当中一个连续的物理区域了,就是一个逻辑上的概念啊,这个咱们刚才也提到了是吧?诶,专门放这个的,专门放这个的,哎,下边又说了一句话,说它是由若干个零散的页面和一些完整的区呢组成的。啊,大家肯定就疑问了,你要说是一个完整的区呢,没毛病啊,能理解一个一个的区吗?但怎么还整一个零散的页面呢?诶,这是什么东西呢?诶,这块呢,咱们就引入了下边这样的概念,你看环环相扣啊,非常的精妙啊,那为什么又引入了一个叫碎片区的一个概念呢?又懵了啊,刚刚觉得挺完美的,怎么又出来个东西?大爷你看啊,我们现在讲解,你看是不是有道理。
16:00
基于我们上边这个场景,大家你想我现在的话呢,呃,这个咱们说使用in动DB存储引擎存储个表,里边呢,是不是有这个句子索引啊,句子索引呢,里边是不是涉及到我们索引中一个呢,是我们上边的这个叫呃叫什么呀?呃非叶子节点一个呢,是我们下边这个叫叶子节点,好,咱们刚才说了叶子节点这块呢,咱们来专门呢,是不是放用这个区呢去放。是吧,哎,用这个区去放,咱们叫这个数据段是吧?呃,里边放的是这个区的数据,然后呢,上面这些非页的节点呢,我们用专门的区去放啊,它对应的这个段呢,我们叫做非页的节点段啊,你也可以叫索引段。好,那如果说我们这个表中的数据啊,比较小,就只有几条记录,那只有几条记录的话呢,那你最起码是不是也有一个,呃,可能会有一个这样的叶子节点的一个概念,有一个非叶子节点概念,那最起码呢,我们说这块呢,段少中咱们就用一个区来表示吧,这个非叶子节点呢,咱们也用一个区来表示吧,一个区呢,咱们说是不是一兆啊,那就这也是一兆,言外之意呢,我们一个表呢,如果你只有几条记录的话呢,说你得有两兆的空间。
17:02
啊,一个呢,放叶子的,一个放这个非叶子的,接连的两兆,反正这时候大家一想这个空间啊,是不是浪费的有点厉害呀,只有几条记录,我们就干了两兆的空间。啊,然后的话呢,你像我们再去每增加一个索引,那一个表中的记录数呢,可能不多,但是呢,这个A字段呢,可能挺多的啊,那这时候我们其中给几个字段又加索引了,只要一加索引的话呢,又会分成这个非叶子节点和我们的叶子节点啊,又得去每增加一个索引,又都得去申请这个申请两兆的空间,这个简直呢是不是浪费的不要不要的。啊,太浪费了是吧?啊,那这时候怎么办呢?啊,咱们到目前为止讲的这个区啊,都是非常纯粹的什么意思啊,就是你这个区就归属于你这个段,你这个区啊就归属你这个段啊,你现在又来了一组索引啊,那你那组索引呢,再建你自己那个,呃,再提供你自己那个段儿里边的那个区。都是一兆一兆的是吧,太纯粹了,这个时候我们就造成了这个空间的呀,极大浪费,那怎么办呢?哎,那这时候我们就考虑说说能不能咱们就要不就共用一下是吧,那共用一下行不行也可以啊,那一旦提到共用了,这就提到这个碎片区的概念了。
18:10
啊,那举一个生活当中的例子啊,也可能也不是那么恰当啊,诶你比如说就像我们这个代工厂一样啊,这个代工厂的话,我们知道他们这个,呃,劳动的生产效率呢,是极高的啊,你像这个富士康呀,比亚迪呀,这是咱们说国内的比较典型的这种代工厂啊,富士康这这这也得算咱们的是吧?那么这个代工厂你看,比如说他给这个苹果呢,去代工生产这个手机啊平板,呃,在这个苹果这个新品呢,要发布之前呢,它这个产量是极高的,对吧?呃,新品发布之后呢,如果这个产品一般,那么整个这个代工厂呢,专业针对这个苹果的话呢,这个代工的这个订单呢就少了,那这时候它有很多富裕的这个劳动力啊,那怎么办呢?它是不是可以代工其他的这样的一些产品。对吧,诶这样的话就把它呢,能够很好的去利用起来,就好比我们这里边这个区一样,你这里边儿只有几条数据,你扔了一兆的空间就放了几条,这太尴尬了,都空着,然后呢,其他这个,所以呢,在创建的时候呢,也是扔几条数据,剩下都空着,极大的浪费。
19:06
那是是咱们要不共用一下,哎,可以是吧,所以我们这里边考虑到。啊,这个以完整的区为单位给某个段呢?呃,分配数据的时候呢,对于数据量比较小的场景太浪费了,那我们就提出一个碎片区的概念,在一个碎片区当中,并不是所有的页都为了存储某一个段的数据呢而存在的。而是呢,碎片区中的叶呢,可以用于不同的目的,有些叶呢是给这个段A的,有些叶呢是给这个段B的啊,诶这样的一个场景,诶这个大家是不是就能理解了。啊,就能理解了,对吧?哎,就是我们很好的,是不是利用一下你这个空余的这个空间了,就啊那你大家看我们说段儿里边呢,有这个区,咱们上边是不是说段里边是有区的,对吧?那现在呢,这个问题来了,你这个区里边叫碎片区。这个区呢,哎,有一些数据呢,有些页呢是给这个段的,有一些这个页呢是给这个段的,那我问你说这个区它是,呃,这个咱们说区上面不是有个段的概念吗?你说这个区是算这个段来了,还是算这个段里的。
20:08
啊,干脆咱们说都别算了啊,这个区呢,咱们说归谁所有啊,咱们说这个碎片区它呢只属于这个表空间,相当于是我们段上边的一个概念。对吧,因为呢,你既不独立属于这个段,又不独立属于这个段,那干脆呢,我们直接让这个呃表空间呢,来去管理这个区得了啊,那这个区呢,是不是叫碎片区啊,哎,就可以了。好,那么以后呢,我们再给某一个段呢,分配存储空间的时候呢,这个策略呢,就是这样子的,哎,大家你看说刚开始的时候啊,咱们向表中插入数据,这时候数据量比较小,那么这个段啊,它就是从这个碎片区当中,以单个页面为单位呢,去分配这个存储空间。就是你别上来就整一个区,一兆空间太浪费了,对吧,其实是两兆是吧,一个呢存叶子,一个存废叶子,两兆空间太浪费了,你就先呢拿这个碎片区里边先用着对吧?哎,当你这个段中呢,达到了占用了这个32个碎片区以后啊,这呢是我们设计当中啊规范的一个这个这个数值32个碎片区达到这么多以后的话呢,我们再以完整的区为单位,再去分配这个存储空间啊,就会更靠谱一些。
21:14
就像公司在刚创业的时候,其实你像公司里边的电脑是不是你可以租啊,呃,这个服务器你是不是也可以租啊,没有必要呢,一创业的时候呢,是不是,呃,当然包括这个场地那更得租了,你不能说一上来我们先呃造一块这个买一块地啊,买一块地呢,我们先建房子啊,建完房子以后呢,我们再买电脑,再买服务器啊都整完之后呢,这黄花菜都凉了啊,前期呢,这个资金比较少,那你就剩就就能租就租对吧,当有钱以后啊,像这个头条啊,这个这个这个联想啊是吧,联想现在这个蜂窝的这个舆论的中心是吧。呃,包括呢,我去这个中关村的时候,当时跟这个京东呢谈合,跟这个百度啊谈合作的时候啊,京东也去过啊,京东是在亦庄,那百度谈合作的时候呢,旁边就联想啊,联想呀百度啊,呃,他们这是一片的,这个这个这个叫什么区域啊,然后几栋楼呢都连在一起,像这个百度呢,这个各个楼顶层呢都连在一起,之后呢,又跑到生活区啊,特别好啊,就是当你达到一定规模的时候呢,我们就可以独立的划归一个,比如一个工业园区啊,都归你所有啊,管理起来更方便是吧,前期的时候呢,完全没有必要。
22:20
啊,这呢,就我们说这样的一个特征。啊一说到这个呢,我想起来原来一个,呃,这个我们一个同学哈,这个读研究生的一个同学,这个同学他的女朋友呢,是比他小一届啊,然后呢,这个在北航那毕业之后呢,说去了一家公司特别不靠谱啊,那时候大概是他比我们小嘛,啊1314年的时候啊,说在那个中关村附近啊说那家公司呢,就特别不靠谱,然后这个每天的这个人员流动性非常大啊,干了不到一年说就离职了啊说后来我说哪家公司啊,说去了叫字节是吧,啊字节调动最初的时候呢,就是这样子的嘛,对吧。好,那么基于此的话呢,我们再来谈一下这个段的概念,所以说这个段的话呢,你看我们上边有一个更精确的一个表达说段啊,哎,他们在我们讲它的时候呢,说是由一些完整的区构成的,但是你在最初给这个段分配这个数据的时候呢,由于数据量比较小,是不是说呢,你只是使用了这个碎片区里边的一些零散的页面啊。
23:16
所以说你这个段呢,就是由一些零散的页面啊,以及一些完整的区呢构成的,哎,这个我们就说的这样的一个意思,好,那么这样的话呢,我们就把这个区段和这个碎片区,哎,咱们就说清楚了,你看是环环相扣,我们并不是说呢刻意分出这样的概念,而是呢,基于需求,我们就把这个概念呢,一个一个的给明确了,那么接下来的话呢,我们再看下这个叫区的一个分类区的话,我们就可以分成这样的第一个呢,叫空闲区。然后接下来的话呢,我们里边放了一些数据了,就是有剩余空间的碎片区,然后接着用用用这个碎片区呢,空间剩余空间都没有了,就是满了for frag是吧,Fragment嘛,这个再者呢,就是附属于某一个段的区,就专属呢,诶给某一个段呢,去使用的这个完整的区,OK。
24:00
行,那么前面这个啊,Free和这个free f跟这个for fg这三种状态的区啊,咱们算成就都算是叫碎片区了,它就只属于这个表空间的,而我们处于这个啊,隶属于某一个段,这个区呢,它就只属于是某一个段的。啊,这个我一说大家应该都能明白对吧,应该很清楚,就好比是呢,我们在这个军事上一样,这个表空间呢,就好比是这叫集团军,然后呢段呢,就好比是师区呢,就相当于团啊,叫军师旅团营是吧,咱叫团了啊,叫旅也行啊,这个军事旅团营啊这样的几个概念,那么正常来讲呢,是师下边呢,这个军下边有师,师下边有团,是这样的一种隶属关系,呃,但是说我们也有一些特殊场景,比如说一些独立团,这些独立团的话呢,就不归属于某一个师了,而是直接呢,由我们这个军来进行这个统一调度的啊,就是这样的一个概念。好,那这呢,我们先把这个事儿呢说清楚。好,那么接着的话呢,我们再看最后一个概念啊,叫做表空间啊,这个呢,也是我们关于接触数据存储的最上层的一个概念了,咱们在前面讲到第二章的时候呢,实际上呢,是不是就提到过这个表空间,对吧?咱们墨迹了好几次了啊,翻来覆去的讲,大家应该目前很熟悉了,就是说我们在5.5啊某一个小版本,还有5.6的某一个小版本当中啊,咱们默认情况下呢,把数据表中的数据啊,都存放在这个系统表空间当中,叫IB data1,然后呢,在这个,呃,至少是5.7以后了,对吧。
25:23
实际上呢,是5.6的某一个版本开始,咱们都开始用了一个叫独立表空间,相当于每个表呢,我们会提供一个叫ID这样的格式的文件啊,这呢就是我们所谓的叫独立表空间的方式啊,当时呢,我们就提到了这个表空间的概念,那以及呢,我们刚才呢,在讲解的时候呢,提到过说最上层啊多尔区,多尔和脆片区是直接呢归属于我们这个表空间呢所管理的,对吧。好,那我们现在来看一下这个表空间的概念,它呢看作是我们诺DB存储引擎逻辑架构的一个最高层了,所有的数据呢,都存放在这个表空间当中,它是一个逻辑上的一个容器啊OK,然后呢,具体的划分的话呢,可以分成叫系统表空间,独立表空间啊,撤销表空间,临时表空间啊这样的一些概念啊,有同学呢,可能之前也都接触过,对吧,包括呢,我们像设置这个Oracle的时候,我们可以呢,诶,在它的一个管理的界面上呢,专门去设置一个表的表空间,我们给它多大,超出这个表空间的话呢,这个表就没有办法再添加数据了啊,进而呢,也能证明这个表空间呢,就是我们真正管理这个磁盘文件的一个概念是吧?
26:28
好,下面的话呢,我们来看一看,这个叫独立表空间,说独立表空间呢,就是每个表我们给它分配一个表空间啊,每个表分配一个好处是什么呢?就是我们这个独立表空间呢,由于它记录的就是你单表这个数据,呃,便于我们这个表呢,进行数据的一个迁移啊,不同的数据库之间去迁移表数据的话呢,我们针对这个独立表空间来操作就可以了,很方便。那而且呢,这个空间的回收呢,也是比较方便的,比如我们通过这个job table的方式呢,咱们就可以回收一个表,把这个表呢删掉了,表数据呢,是不是也不要了,那这个操作完以后的话呢,我们底层对应的那个ID文件啊,比如咱们使用的是ID格式的方式是吧?ID文件呢,就也跟着呢做了一个回收啊,所以回收呢非常方便啊,那如果说我们要是统计分析或者是日表的情况呢,咱们要删除大量数据以后呢,还可以通过叫al table啊这这你把这个表呢放在这儿叫NG呢,等于in DB,通过这样的一种方式呢,咱们还可以回收不用的这个空间。
27:24
啊,也很方便啊,相当于呢,呃,不管是我们删除这个表释放表空间也好,还是说呢,我们通过这样的方式呢,去释放一些碎片空间也好,诶整体来讲的话呢,这个独立表空间都不太影响我们整个程序运行的一个性能啊,相对来说呢,还是不错的一个选择,所以说呢,我们在5.6某一个版本之后是吧,我们都主张呢,诶对于表使用这个独立表空间的方式。好诶具体呢,表空间下边呢,有这个段啊区域啊页啊是吧?这个咱们前面已经讲过了,诶接着呢,去提到一个,当我们创建新建的一个表的时候呢,对应的这个ibd格式的文件呢,说它占96K大小,呃对应的是有六个页,96除以16KB,是不是就是正好六个页面啊,相当于默认的话呢,我们就有六个页面的大小啊,这个呢,咱们也可以呢演示一下。
28:09
啊,注意你看我这块写的是在5.7当中是这样啊,这个8.0就不是了,哎,大家想想为什么呀。啊,为什么?嗯,咱们先来演示这个5.7,好大家看,嗯,那首先的话呢,我use一下叫DB1,嗯,然后呢,我们先去一下叫tables,看我们这里边呢有几张表,那这表呢,咱们不太确定里边有没有数据,那不妨我们就新建一个表吧,那这块我们create一个table呢,比如说就叫temp吧,这个我们叫ID类型的,哎,Name,这个a water。嗯,类型常用的比如15是吧,好,那这块我也没有指明使用这个DB啊,因为咱默认的使用的啊,比如我们这个show engines。这个咱们默认呢,使用的是不是就in得对比啊,哎,所以它这个呢,使用的也是这个印度DB的存储引擎,好,那么我们创建好这张表以后呢,底层它其实就会在没有添加数据的时候呢,就会给我们呃,创建对应的叫ibd格式的文件啊这块我们的。
29:05
来给大家新开一个啊,连接咱160上的这个MYSQL5.7的服务器,那这时候我们去做一个外查看一下我们的这个数据目录啊Li。下载这个MS口对吧?啊然后呢,我们接着呢,去CD一下DB test1啊这个数据库下的啊进来,然后再LL好针对于我们这个这呢是这个表结构,这呢是我们存放表数据的,好大家看这个呢是叫98304,诶咱们看一看这个大小是多少。这呢是98304是不是字节呀,首先呢,我们除以一个1024,哎,这呢就是我们得到多少KB,然后再去除以我们是不是16KB,这是一个页的大小,是不是一共就六个页啊啊没有问题啊,刚才呢,我们这块提到了是不是也就是有六个页的大小。那为什么8.0中就不是了呢?哎,8.0是不是呢,你得先证明一下,那首先呢,我们也是去use一下,叫DB test1是吧,哎,我们说一下这个tables。
30:00
啊,这呢也有几张表,我们就新创建一个啊,Create table,那我们跟刚才一样啊,Tab ID in的类型啊,Name。哎,Water类型,比如长度是15,好,这个呢也是一样啊,咱们也去受一下这个engines吧。好,这时候咱们默认使用的也是这个印度DB啊,所以这时候我们没有显示的指明这个的时候呢,它使用的就是印度DB了,在印度DB这个场景下呢,我们看一看这个表中没有数据它的默认的文件大小。哎,同样的道理,我们呢,也是CD来玩一下。啊啊,然后呢,MY。哎,然后呢,接着找我们这个DB台测一是吧,哎,CD。啊,DB1好进来,然后这时我们在L好大家看啊,此时呢,我们这个time呢,你看叫ID格式文件,显然呢,是不是跟我们刚才看到的这个大小呢,就不太一样了。哎,就不太一样了,哎,那这个呢,是怎么去体会呢?哎,咱们算算这是多少个页啊,看能不能除尽,这是114688是吧?哎114,哎688首先呢,除以这个1024,我们先看是多少KB。
31:09
啊能除尽,然后我们再去除以呢,是不是16这个KB是一个页的大小,大家看结果呢,是不是七啊,哎,相当于呢,我们这时候呢,就是七个页啊,但是你要注意啊,我们这七个页里边,它可不是完全的来存储我们的数据和索引的,因为呢,咱们在8.0当中啊,咱们是不是诶相对于5.7来讲呢,它把这个F2M和我们的ibd呢就合一了呀,诶合一以后呢,我们统一的叫ID了,所以它就会更大一些。哎,这个注意一下啊,有这么个细节的情况。好回过来,那么我们默认情况下呢,先给你六个页的大小,咱们以5.7为例啊,六个的大小呢,去存储数据的,那么当我们这个数据呢,越来越多的时候呢,这个ID文件呢,它就是一个自扩展的啊,它就可以越来越大啊,逐渐的变大。嗯,OK,这是我们说的这个,因为里边呢要放这个段,要放这个区域,要放这个具体的页了,对吧?OK,呃,那么我们在以前的时候呢,提到了说呃,这个用的叫IB1啊,当时呢,我们也讲过啊,你要都放在这儿的话呢,这个文件呢,也有个默认大小啊,你要放在数据越来越多,它这个文件呢,也是一个自扩展的。
32:11
大次扩展的OK。行,这个呢,我们就说清楚它了啊,然后的话呢,我们也可以查看一下当前这个表当中啊,咱们使用的是不是这种叫独立表空间的方式啊,这个咱们前面也都说过了,在这个呃,5.6之后的某一个版本,它是不是默认的都是使用这个独立表空间是吧?所以呢,这个每一个表是不是都使用一个独立的文件呢?是一个on啊,那就是用的ID这样的一种格式啊,前面也说过了啊,就不墨迹了。好,那么接着的话呢,我们再看一下叫系统表空间啊,这个系统表空间呢,跟独立表空间呢,结构基本上是类似的,但是呢,我们整个MYSQ进程啊,只有一个系统表空间啊,这个就这一个,那就意味着我们除了这个独立表空间这个记录你关于这个表的信息之外呢,我们这个系统表空间还要记录我们整个系统的一些相关信息,对吧?这呢是我们这个独立表空间呢所没有的。
33:00
啊,那么系统这些信息都有什么呢?这个我们举个例子,比如说呢,我们像这个表中插入一条记录啊,那么MYSQL呢,还有一系列的一个校验过程啊,我们以为很简单,就是直接插入呢,其实啊,没有这么简单,首先的话呢,至少得校验一下这个表存不存在插入这个列呢,和表中的列呢,是不是符合语法有没有问题啊,还要呢,知道当前这个表中的这个句子索引和所有的二级索引对应的这个根页面是属于哪个表空间的哪个页面的。很看还非常详细的一系列的操作,然后呢,再把这个记录呢,插到咱们对应索引的这个B加数当中啊,比如说你这个呃句组索引当中是吧,诶这样情况包括呢,你相应的插入数据啊,相应的这二级索引是不是也应该会受到影响啊,也需要做一个添加,OK。那也就意味着我们,呃,在做这个添加数据的时候呢,他做了一系列的这个事情。啊,一系列的这个事情,而上面这里边涉及到的啊,哪个表空间呀,有几个字段啊,像这里边我们涉及到这个表啊,都不是我们这个,呃,这个正常的我们添加语句的这个用户的这个表中的这个字段和表了,那么我们把这些额外的这些数据啊,就称为呢,叫原数据。
34:07
啊,那么这些原数据呢,我们是通过一些系统中的内部表来表达的啊,称为呢叫内部系统表,这个所谓的内部系统表就是我们所谓的叫数据字典,哎,咱们在讲上篇的时候呢,我提到过这个数据字典的这个概念啊,大家还有印象吗?诶,咱们上下篇呢,就结合着来看啊来咱们当初首先呢讲到这个,呃,数据库对象的时候啊,你看我是不是就提到这个数据字典的这个概念了,就是我们系统当中提供的一些表是吧?诶这呢,你看我也提到说成员呢,诶不应该修改,只可查看。啊,这个查看的话呢,其实也会有一些相关的一些限制,来我们看啊。下边呢,就是我们提供的一些数据字典啊,这么多是以这个SSYS下划线开头的啊,其中有四个比较重要的,比如tables columns indexes啊,还有这个FS啊,就对应的是这个字段了啊OK,这四个呢,是比较呃重要的几个表啊,尤其重要是吧,基本的系统表啊,基本的啊数据字典啊,具体这个四个表中的这个字段呢,我就都罗列到这儿了啊,咱就没有必要呢再去深究啊去研究了,好,那么我们说下用户啊,他是不能够直接来访问我们诺DB中的这些系统表的,那你想访问不行。
35:19
啊,你要能访问的话呢,这个权限有点太大了是吧?呃,只是呢,我们系统在你用户做一些添加行为啊,查账行为的时候呢,它会自动的来去调用我们这些表,呃,但是呢,我们说在某些情况下呢,诶,我们希望呢,还是能够去分析一些相关的问题的,那怎么办呢?诶这时候我们又给你开放了一个接口。啊,开放了一个通道,那这是叫STEM,那么在这个STEM当中啊,咱们提供了一系列以in DB开头的这样一些表,哎,大家可以通过这样的指令呢,我们去做一个查看对吧?那么这个查看到的,哎,大家注意哈,说这是不是就意味着我们能够查看上面这样的一些数据字典的呢?那其实不是的啊,咱们这个呢,你注意它是DB开头的啊,那么它并不是我们真正意义上的这个系统的内务表啊,只是为了方便我们去做一些操作,诶我们这块呢,提供了这样的一些表,这个表呢,跟我们以S开头的表中的字段呢,并不是完全一样的啊,大家只是做一个参考呢就可以了。
36:16
行,那么到此为止的话呢,咱们把这一章当中的整个的几个概念呢,就说清楚了,诶大家重点关注的就是我们页内部这个结构和我们这个in DB这个行格式,好,那么这一章呢,咱们就告一段落。
我来说两句