写在前面:我一直认为数据库中已经规定,一个页面中至少要存储2条记录,但是前几天碰到一个问题:为什么INNODB数据页面中最少存储2条记录?一下子把我问住了,知道是这样,但从没有问过自己这是为什么,所以我一直想这个问题,现在刨根问底,终于知道为什么了,下面就把这个问题的原因说一下吧。
在INNODB中,底层数据的存储是通过B+树实现的,一个页面的大小一般设置为16K,不同页面之间通过父子、兄弟挂链,形成B+树结构。
为了说明为什么一个数据页面至少要存储2条记录,下面就先简单叙述一下B树的一个记录插入过程,下面图示中的方框用来表示一个页面,左边和右边的小方框表示最小虚记录及最大虚记录,下面是表示内节点中的KEY指针,每一个KEY都会有一个指针指向其叶子节点的位置,对于叶子节点,这个是没有的。下面假设插入数据的顺序是2-1-3-1.5。
假设一个页面中可以存储3条记录,下就面插入过程图示说明:
现在根页面已经插入满了,此时如果再继续插入,则需要将根页面分裂(根节点的分裂),此时创建一个新的叶子节点,然后将原根页面的全部记录复制到新页面中,新根页面的最小虚记录要指向原来的根页面(新叶子节点),同时将原根页面中的记录全部删除,结果是这样的: