MySQL索引(五)——数据页

数据页的结构示意图:

MySQL索引(五)——数据页_第1张图片

一:文件头:38字节

组成结构:

MySQL索引(五)——数据页_第2张图片

重点组成:

FIL_PAGE_OFFSET:页号,可以简单理解为当前页的地址值
FIL_PAGE_TYPE:当前页的类型
FIL_PAGE_PREV,FIL_PAGE_NEXT:前、后指针,指向前一个和后一个数据页
FIL_PAGE_SPACE_OR_CHKSUM:页的校验和( 注:文件尾部分也有校验和,和文件头部分相等

校验和作用:检查的页的传输是否完整

当我们的页从磁盘加载到内存中,如果数据再内存中发生了修改,那么页的校验和也会发生改变。
每当一个页面在内存中修改了,在持久化之前就要把它的校验和算出来,因为File Header在页面的前边,所以校验和会被首先持久化到磁盘,当完全写完时,校验和也会被写到页的尾部,如果完全同步成功,则页的首部和尾部的校验和应该是一致的。如果写了一半儿断电了,那么在File Header中的校验和就代表着已经修改过的页,而在File Trailer中的校验和代表着原先的页,二者不同则意味着同步中间出了错。

二:文件尾:8字节

(1):前4个字节代表页的校验和:
    作用:这个部分是和File Header中的校验和相对应的。
(2):后4个字节代表页面被最后修改时对应的日志序列位置(LSN):
   作用:这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步过程
出现了问题。

三:用户记录、空闲空间:

空闲空间:

我们自己存储的记录会按照指定的 行格式存储到 User Records (用户记录)部分。
但是在一开始生成页的时候,其实并没有User Records这个部分。
每当我们插入一条记录,都会从Free Space(空闲空间)部分中申请一个空间划分到User Records部分。
当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使用完了
如果还有新的记录插入的话,就需要去 申请新的页了。

用户记录:

User Records中的这些记录按照指定的行格式一条一条摆在User Records部分,相互之间形成单链表。

示意图:

MySQL索引(五)——数据页_第3张图片

四:最大、最小记录

我们插入的记录按照索引值有序排列成一个单链表,而这两条记录是MySQL给我们添加的
相当于给我们的单链表增加了一个头、尾结点
注: 这两条记录 不是我们自己定义的记录,所以它们并不存放在页的User Records部分,他们被单独放在一个称为Infimum + Supremum的部分。

示意图:

MySQL索引(五)——数据页_第4张图片

五:页目录:

作用:提升在内存中从数据页中找到指定记录的速度

在页中,所有的记录都是以 单链表形式存储的,这样导致查询效率很低
当数据页加载进内存,为了更快的在找到 数据页的记录,我们建立了一个页目录,
使得可以通过二分检索的方式查找指定的记录

结构:数组结构

 将数据页中的所有记录平均分成几个组, 页目录用来存储每组最后一条记录的地址
这些地址会按照 先后顺序存储(数组,物理上连续存储)起来,在页目录中存储地址的位置叫做 槽(slot)。
每个槽相当于指针,指向了不同组的最后一个记录。

示意图:

MySQL索引(五)——数据页_第5张图片
MySQL索引(五)——数据页_第6张图片
注:第一组只存放MySQL给我们提供的最小记录

六:页面头部

结构示意图:

MySQL索引(五)——数据页_第7张图片

数据页整体结构图:

MySQL索引(五)——数据页_第8张图片

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