数据页里到底放的什么数据?
首先我们知道在mysql里,基本单位是页,我们姑且成为数据页,数据页的类型有不少,但结构都是类似的。
我们表里面的一行行数据,就是对应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作用?
用来校验这个页完整性的。