一、数据页长啥样?

数据页和数据区 - 图1

二、什么是数据区?

在MySQL的设定中,同一个表空间内的一组连续的数据页为一个extent(区),默认区的大小为1MB,页的大小为16KB。16*64=1024,也就是说一个区里面会有64个连续的数据页。连续的256个数据区为一个数据区组。于是我们可以画出这张图:
数据页和数据区 - 图2
MySQL按照这样的方式组织存储在磁盘上的数据,最终的目的都是为了方便、管理、控制。

三、数据页分裂问题

关于B+Tree,你肯定知道B+Tree中的叶子结点之间是通过双向链表关联起来的。
假设现在已经有两个数据页了。并且你正在往第二个数据页中写数据。
在InnoDB索引的设定中,要求主键索引是递增的,这样构建索引树的时候才更方便。假设自定义一个主键索引,但这个主键索引并不一定是自增的。那就有可能出现下面这种情况 如下图:
数据页和数据区 - 图3
假设上图中的id就是你自定义的不会自增的主键。然后随着你将数据写入,就导致后一个数据页中的所有行并不一定比前一个数据页中的行的id大。这时就会触发页分裂的逻辑。
页分裂的目的就是保证:后一个数据页中的所有行主键值比前一个数据页中主键值大。
经过分裂调整,可以得到下面的这张图:
数据页和数据区 - 图4