前面我们介绍过数据存储引擎 (以innodb为例)是对表数据进行读取与写入工作,那么表里的数据如何存储?是以什么格式存放?
innodb是一个将表中数据存储到磁盘上的存储引擎,而真正处理数据的过程是发生在内存中,因为读取硬盘太慢,所以需要把硬盘的数据加载到内存,会一条条记录进行读取吗?答案肯定不会,那样效率很低,会把这些记录放到一个载体,加载到内存,这个载体就称为页,页的一般大小是16KB
我们平时都是以记录为单位进行插入表数据,这些记录在硬盘的存放形式就是行格式或者称为记录格式,行格式有很多种,目前以COMPACT行格式为例进行介绍
row_id :行号
trx_id: 事务id
roll_pointer:回滚指针
1.deleted_flag :标记该记录是否被删除
我们删除数据,表面上已经从硬盘删除掉了,其实数据还在硬盘上,只是修改这个字段为1,表示已经删除,为什么没有移除掉呢?是因为移除的话,会改变原来的结构,会带来性能的消耗,但是这些删除的记录,会一直占用空间吗?答案是不会,因为后面新的记录插入,可能会覆盖掉记录占用的空间
2.min_rec_flag:
B+树每层非叶子节点中的最小目录项标识。目录项不是记录数据的非叶子节点。
3.n_owned
表示一个页中记录会分给多个组,每个组都有一个带头大哥,这个带头大哥会记录该组的记录数的值就是n_owned
4.heap_no
把记录一条一条亲密无间排列的结构称为堆,那么heap_no 就是堆的序号,在页面前面的记录相对较小,页面后面的记录heap_no
相对较大,没新增一个记录,该记录的heap_no 等于该记录前面heap_no +1
5.record_type
表示记录的类型 0为普通记录、1为b+树非叶子节点的目录项记录 2 为infimum记录 3为Supremum记录
6.next_record
它表示从当前记录的真实数据到下一条记录的真实数据距离
Infimum 与 Supremum
这两个是伪记录,infimum 表示是一个页面中最小的记录,Supremum是最大的记录
Page Directory
页中某些记录的相对位置,也就是各个槽对应记录在页面中的地址偏移量
槽:就是页面中每个组最打记录到页面的偏移量