mysql系列2---数据页

115 阅读2分钟

数据页里到底放的什么数据?

首先我们知道在mysql里,基本单位是页,我们姑且成为数据页,数据页的类型有不少,但结构都是类似的。

image.png

image.png 我们表里面的一行行数据,就是对应user records的内容,当然,默认情况下这部分是空的,在执行插入的时候,就是把free space的空间给user records一些(本质上就是链表转换)。

每一个数据页,都会默认有Infimum和Supremum,分表代表了这个数据页的最小和最大记录。user records的内容,都是紧凑的堆在一起的,通过上一章节讲的行数据请求头信息记录的next record把数据串联起来,本质上是一个单向链表,头是infimum,尾是Supremum。即便删除了某一行数据,无非就是在这个行数据标识了一下,链表绕过了他,这个空间并没有释放。

page directory作用?

从名字大概也能看出来,页目录,它存在的意义是啥?假如你要查询一个数据,比如select * from xx where id=5,表内有id1-10十条数据,那比较呆的方式就是从1开始数,但是设计者肯定不会这么low,所以提出了页目录的概念,也就是把一个完完整的数据分成了n组,类似书的目录。当然,目录里面的内容肯定不能太多,所以最大允许8个数据为一组,超过的话就会拆,举个例子,默认情况下有两个组,Infimum是单独一个组,Supremum一个组,插入5条数据,还是两个组,Supremum和5条数据加起来是6个,如果再插入3条数据,Supremum的那个组就会拆成4和5。page directory就会记录三个数据,一个infimum的偏移量,一个是第二组的最大记录所在偏移量,最后就是Supremum所在偏移量。那在找数据的时候,就可以直接用2分法,找到这个页目录的中间记录的最大数据,然后快速定位他所在的槽位,然后顺序遍历即可,不用无效遍历了。

page header作用?

page header用来记录类似这个数据页存放了多少数据,有多少槽位等信息。

File header作用?

记录了一些比如上一页,下一页地址,类型(存放数据的就是索引页),属于哪个表空间

File Trailer作用?

用来校验这个页完整性的。