• 我们平时在执行CRUD的时候,都会从磁盘上加载数据页到buffer pool的缓存页里去,然后更新了缓存页之后,又会刷新回磁盘上的数据页里去。
  • 也就是说MySQL中进行数据操作的最小单位是数据页,那么数据页到底长什么样子呢?

每个数据页,默认有16KB大小,一个数据页拆分成了很多个部分,大体上包括文件头、数据页头、最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部。

Mysql 页 mySQL页面什么样_数据库


其中文件头占据了38个字节,数据页头占据了56个·字节,最大记录和最小记录占据了26个字节,数据行区域的大小是不固定的,空闲区域的大小也是不固定的,数据页的大小也是不固定的,然后文件尾部占据8个字节。

说白了,这个数据页就跟每一个数据一样,都是由MySQL开发人员设计出来的一个特殊的存储格式,

也就是说通过这种特殊的存储格式在磁盘文件里去存放一个又一个的数据页,每个数据页在磁盘里实际存储的时候,就是包含了上述一些特殊的数据,然后每个数据页里还有专门的区域包含了多个数据行。

把数据插入数据页的过程

刚开始一个数据页可能是空的,没有一行数据的,此时这个数据页实际上是没有数据行这个区域的。

Mysql 页 mySQL页面什么样_缓存_02

假设现在要插入一行数据,此时数据库里可是一行数据都没有的,那么此时是不是应该先从磁盘上加载一个空的数据页到缓存页里去?

此时空的数据页就如上图所示,而加载的过程,如下图所示:

Mysql 页 mySQL页面什么样_缓存_03


接着我们就可以在buffer pool中的一个空的缓存页里插入一条数据了。

  • 注意,缓存页和数据页是一一对应的,它在磁盘上的时候就是数据页,数据页加载到缓存页了之后,我们就叫它缓存页
  • 在缓存页里插入一条数据,实际上就是在数据行那个区域里插入一个数据,然后空闲区域的空间会减少一些

当缓存页里插入了一行数据之后,缓存页看起来如下图所示:

Mysql 页 mySQL页面什么样_数据库_04


接着可以不停的插入数据到这个缓存页里去,直到它的空闲区域都耗尽了,就是这个页满了,此时数据行区域内可能有多行数据,如下图,空闲区域没了:

Mysql 页 mySQL页面什么样_缓存_05


而且,在更新缓存页的同时,这个页在lru链表中的位置会不停的变动,而且肯定会在fluh链表里,所以最后它一定会通过后台IO线程根据lru链表和flush链表,把这个脏的缓存页刷到磁盘上去:

Mysql 页 mySQL页面什么样_数据_06