个人对mysql中innodb的数据存储结构的一些理解,请各位老师帮忙指正一下,看看是否理解的正确

请各位老师允许我先做个自我介绍哈,本人是一枚产品经理,在工作过程中对开发产生了浓厚的兴趣,但碍于自己不会编程,只是对前后端开发语言有些许了解,所以想着先学习C语言打打基础,难受的是C语言会了一些,但是在海量的练习过程中,我迷失了自己,感觉越做越没信心,刚好看网课时看到了数据库的有关视频,然后就一发不可收拾,感觉学数据库的过程比C语言更容易理解一些。

然后最近看到了innodb数据存储结构这一章,总的学习下来就得到了以下这些感悟,所以想烦请各位老师对我的理解进行指正,本人衷心的想向各位老师学习,希望各位老师不吝赐教!!!

接感悟:

从底层往上来说。

一、数据以页的基本形式存在于表空间中,数据与数据间以单表链接的形式进行链接,其中一行的用户数据(行记录)会因为行格式不同有稍许的区别,以Compact为例,主要包含了变长字段长度列表+null值列表+记录头部信息+真实数据,其中记录头部信息比较重要,它包含了delete_mask(删除标记,delete为1,未删就为0)+min_rec_mask(最小记录标记)+record_type(数据类型)+heap_no(该记录在组中的位置,其中0和1被最小及最大记录占用)+n_owned(在组中最后一条数据中展示本组中所包含的数据条数总和,其余皆为0)+next_record(指向下一条数据的指针,形成单链的基础),真实数据之前还存在三个隐藏字段(DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR),其中DB_ROW_ID是创建表时没有创建主键,则会先搜寻表中具有唯一性属性的字段作为主键,若还是未搜索到,DB_ROW_ID就会自动生成一列数字(6字节)作为主键,若数据过大会出现行溢出现象,在Compact中它会将部分数据存储在本页中,并生成一个指针指向以blob形式存在新页中的溢出数据;若行格式为Dynamic或Compressed,行溢出的数据直接生成一个新的blob页,原数据处生成一个指针指向新页地址。

二、一个页的大小为16KB,页的结构从上至下分别为file header/page header/infimum+supremum/user record/free space/page directory/file trailer。

1.file_header分别包括了这个页面的通用信息,如页id,上一页,下一页,校验和,lsn等,其中校验和(checksum)及lsn是对判断页是否完整的重要指标,主要原理为当数据从硬件磁盘中读取至内存进行修改时,内存中的校验值会进行改变,在将新的修改过的数据刷盘至磁盘时,若中途发生意外状况(如断电),刷盘停止,当再次连接进行刷盘时内存中的checksum会对刷到一般的磁盘中的checksum进行校验,此时有两种解决方法,一是在当初刷盘开始前设置记录刷盘实时位置的变量,这样就可以在发生意外之后读取刷盘停止之前的位置,继续进行刷盘;第二种方式就是在硬件磁盘中刷到一半的页进行回滚操作,重新开始刷盘;

2.file trailer 包含了8个字节,分别是前4个字节的checksum以及后4个字节的lsn;
3.page header 包含了插入记录的方向和数量;

4.page directory 页目录其实就是槽(slot)的合集,单个的槽是取每一组数据(4-8条不等)中最大的那个数值作为这组数据的地址偏移量,它可以让我们使用二分法,方便了我们在页中对数据进行定位及查找;

5.infimum+supremum 这是两条虚拟的记录,是自动插入在页中的;

6.free space 页中无数据时,页内都为空闲空间,当数据一条条插入后,空闲空间也随之减少,一般来说,一个页的空间不会全部填满

7.user record 用户记录以行格式的形式一条条记录在页中,以单链接形式存在,这其中就包含了记录头信息,在【一】中已有提及;

二、页往上的结构依次为区,段,表空间。
区从使用类型上分为空闲区(还没用到该区内的任何页数据),数据未满的碎片区(碎片区中仍有可以使用的页),数据已满的碎片区(碎片区内的数据已满),以及特属于某个段的区
其中特属于某个段的区由多个页通过一定的顺序组合成的集合,在物理层面上也实现连续,方便I/O查询;
段是有若干个碎片区和完整的所属某个段的区构成,因插入数据的体量大小不同,在刚开始插入时,这些数据都会进入数据未满的碎片区内的页,当某个段的数据占据了32个碎片区页时,这些页就会重新申请以一个完整的区形式进入对应某个段中;
表空间是innodb存储引擎中的最大层,它包括系统表空间(ibdata1)以及独立表空间(.ibd),在5.7版本中,独立表空间包含了.frm和.ibd文件,一个存储了表结构,一个存储了表数据,在8.0中,表结构及数据统一放在了.ibd中

再次烦请各位老师对我的理解进行指正,十分感激!!!

你可能感兴趣的:(mysql,数据库)