29、理解数据在磁盘上的物理存储之后,聊聊行溢出是什么东西?
00 分钟
2022-8-26

29、理解数据在磁盘上的物理存储之后,聊聊行溢出是什么东西?

上一篇文章我们已经理解清楚了一行数据在磁盘上的物理存储结构了,其实理解了这个,你也就理解了每一行数据在磁盘上是如何存储的,以及他被加载到缓存里来的时候,一行数据都包含哪些东西了。
今天我们来聊聊行数据的物理存储的一个高阶话题,就是行溢出到底是个什么东西?
我们之前已经初步了解到,实际上我们每一行数据都是放在一个数据页里的,这个数据页默认的大小是16KB,那么之前就有人在后台提过一个问题:万一一行数据的这个字段都远超一个数据页的大小了呢?
比如有一个表的字段类型是VARCHAR(65532),意思就是最大可以包含65532个字节,那也就是65532个字节,这就远大于16kb的大小了,也就是说这一行数据的这个字段都远超一个数据页的大小了
这个时候实际上会在那一页里存储你这行的数据,然后在那个字段中,仅仅包含他一部分数据,同时包含一个20个字节的指针,指向了其他的一些数据页,那些数据页用链表串联起来,存放这个VARCHAR(65532)超大字段里的数据
我们看下图,就给出了这个示意
notion image
上面说的这个过程,其实就叫做行溢出,就是说一行数据存储的内容太多看,一个数据页都放不下了,此时只能溢出这个数据页,把数据溢出存放到其他数据页里去,那些数据页就叫做溢出页。
包括其他的一些字段类型都是一样的,比如TEXT、BLOB这种类型的字段,都有可能出现溢出的,然后一行数据就会存储在多个数据页里。
讲到这里,其实就已经把我的行数据的物理存储相关的内容都已经讲完了,很多琐碎和细节的东西,其实不需要我们在这里来死扣他,大家其实要理解的,就是一行数据的物理存储结构,然后这个数据其实是在一个数据页里的,如果一个数据页里放不下一行数据,就会有行溢出问题,存放到多个数据页里去。
讲到这里,我们可以做一点总结,当我们在数据库里插入一行数据的时候,实际上是在内存里插入一个有复杂存储结构的一行数据,然后随着一些条件的发生,这行数据会被刷到磁盘文件里去。
在磁盘文件里存储的时候,这行数据也是按照复杂的存储结构去存放的。
而且每一行数据都是放在数据页里的,如果一行数据太大了,就会产生行溢出问题,导致一行数据溢出到多个数据页里去,那么这行数据在Buffer Pool可能就是存在于多个缓存页里的,刷入到磁盘的时候,也是用磁盘上的多个数据页来存档这行数据的。
希望大家能够把最近学到的行数据物理存储结构,与之前学到的Buffer Pool缓存机制结合起来去理解,把他们有机的融合为一体。
接下来,我们就会开始学习数据页的物理存储结构,然后是表空间的物理存储结构,最后是学习这些数据以物理存储结构的方式,在磁盘上存储的时候,是放在哪些磁盘文件里的。
只要把后续那些内容学完,那么大家就对数据库的Buffer Pool缓冲读写机制,以及磁盘上的物理存储机制,就完全理解了,而且这两个机制都是有机结合在一起的,Buffer Pool的数据是从磁盘上读取出来的,Buffer Pool里更新的数据又会刷新到磁盘上去。
在这个过程中,整个数据的物理存储机制,包括行数据、数据页、表空间、磁盘文件,这些概念,大家也都会理解了,到时候自然理解了数据在磁盘上如何存储的,加载到Buffer Pool缓存页之后如何存储的。

评论