数据页、数据区的解析

一、数据页

前面几节一直在讲一个概念:读取数据的时候,是将磁盘中的数据页读取到Buffer Pool的缓存页中,然后又会刷回到数据页中。所以mysql进行数据操作的最小单位应该是数据页,那么我们现在就来了解了解数据页。

每个数据页的大小,默认值为:16kb,那么这16kb都是用来存放数据的吗?明显不是,其实数据页被拆分了很多部分:文件头、数据页头、最小记录、最大记录、多个数据行、空闲空间、数据页目录以及文件尾部。如下图:

其中文件头占据了38个字节,数据页头占据了56个字节,最大记录和最小纪录占据了26个字节,数据行区域的大小是不固定的,空闲区域的大小也不是固定的,数据页目录的大小也是不固定的,然后文件尾部占据8个字节。这些结构都是mysql开发人员设计出来的一个特殊的存储格式。

接下来我们思考下,假设我们现在要插入一行数据,此时数据库里可是一行数据都没有,那么此时是不是应该先是从磁盘上加载一个空的数据页到缓存页去?接着我们是不是应该在buffer pool中的一个空的缓存页里插入一条数据?缓存页与数据页是一一对应的,它在磁盘的时候就是数据页,数据页加载到缓存页里就是缓存页了。所以此时在缓存页里插入一条数据,实际上就是在数据行那个区域里插入一行数据,然后空闲区域的空间会减少一些,此时当缓存页里插入了一行数据之后,其实缓存页此时看起来如下,接着你就可以不停的插入数据到这个缓存页里去,知道它的空闲区域耗尽,这个页就满了。此时数据行区域内可能有很多行数据。

二、数据区(extent)

表空间的磁盘文件里,其实会有很多很多的数据页,数据多了就不便于管理,所以在表空间里又引入了一个数据区的概念,英文就是extent;

一个数据区对应这连续的64个数据页,每个数据页是16kb,所以一个数据区是1MB,然后256个数据区被划分为一组。对于表空间而言,他的第一组数据区的第一个数据区的前3个数据页都是固定的,里面存放了一些描述性的数据。比如FSP_HDR这个数据页,它里面就存放了表空间和这一组数据区的一些属性。每个表空间就是对应了磁盘上的数据文件,在表空间里有很多数据区,一组数据区是256个数据区,每个数据区包含了64个数据页,是1MB。

借道友法力一用:

========================== stay hungry stay foolish =============================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值