第四章 InnoDB记录存储结构
序言
前面我们介绍过数据存储引擎 (以innodb为例)是对表数据进行读取与写入工作,那么表里的数据如何存储?是以什么格式存放?
innodb页介绍
innodb是一个将表中数据存储到磁盘上的存储引擎,而真正处理数据的过程是发生在内存中,因为读取硬盘太慢,所以需要把硬盘的数据加载到内存,会一条条记录进行读取吗?答案肯定不会,那样效率很低,会把这些记录放到一个载体,加载到内存,这个载体就称为页,页的一般大小是16KB
innodb行格式
我们平时都是以记录为单位进行插入表数据,这些记录在硬盘的存放形式就是行格式或者称为记录格式,行格式有很多种,目前以COMPACT行格式为例进行介绍
- 记录的额外信息
服务器为了管理好记录,添加记录的额外信息,分为三部分:变长字段长度列表、NULL值列表、记录头信息
1)变长字段长度列表
就是针对与数据库变长的数据类型(例如:TEXT、VARCHAR(M)),存储数据时,占用字节数进行存储起来,不然mysql会很懵逼,不知道需要多大字节空间
2)NULL值列表
就是存储记录中值为null的列,进行统一管理
3)记录头信息
- 记录的真实信息
row_id :行号
trx_id: 事务id
roll_pointer:回滚指针
innodb页结构
- User Records
记录在页中存储示意图
这些记录是按照指定的行格式一条一条放在User Records中,为了管理好User Records 记录,innodb在行格式中下了一番功夫,隐藏在行格式中记录头信息部分,记录头信息结构如下:
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
页中某些记录的相对位置,也就是各个槽对应记录在页面中的地址偏移量
槽:就是页面中每个组最打记录到页面的偏移量
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!