我们执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页上去,更新了缓存页后,又会刷新回磁盘上的数据页里去。
InnoDB进行数据操作的最小单位,就是数据页,那么我们之前已经给大家分析过了一行一行数据在磁盘和缓存中存储,具体格式是什么样的。
每个数据页默认是16K,是不是每个数据页里边就是一行一行的数据呢?
没这么简单!
数据页会分为很多个部分,大体上来说分为文件头、数据页头、最小记录最大记录、数据行、空闲空间、数据页目录、文件尾部。
各部分含义详细介绍:
名称
中文名
占用空间大小
简单描述
File Header
文件头部
38字节
页的一些通用信息
Page Header
数据页头部
56字节
数据页专有的一些信息
Infimum
+ Supremum
最小记录和最大记录
26字节
两个虚拟的行记录
User Records
数据行
不确定
实际存储的行记录内容
Free Space
空闲区域
不确定
页中尚未使用的空间
Page Directory
数据页目录
不确定
页中的某些记录的相对位置
File Trailer
文件尾部
8字节
校验页是否完整
通过上图这种特殊的存储格式,InnoDB在磁盘文件里存放了一个又一个的数据页,每个数据页在磁盘里实际存储的,就是包含了上述一些特殊的数据。每个数据页里还有专门的区域包含了多行数据,每个数据行,就是用图1的格式来存储的了。
当我们第一次插入数据到数据页的时候,数据页可能是空的,这时候的数据页是没有数据行那个区域的。
假如我们现在要插入一行数据,此时数据库里一行数据都没有的。
当向缓存页里插入一条数据时,实际上就是在数据行那个区域里插入一行数据,然后空闲区域的空间会减少一些,此时当缓存页插入了一行数据后,此时缓存页看起来就像这样了。
随着不停的crud,就会不停的插入数据到这个缓存页里去,直到空闲区域耗尽,这个页就写满了,此时数据行去也就会有很多行数据。
在更新缓存页的同时,它在lru链表里的位置也会不停的变动,而且肯定会在flush链表里,所以最终它会通过后台的IO线程把这个缓存页刷到磁盘上去。
对数据页内部结构的介绍就差不多了,后边还会介绍InnoDB对数据页的管理,表空间这些概念。
END
如果你喜欢本文,请关注 南山的架构笔记