第四章 InnoDB记录存储结构

第四章 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
    页中某些记录的相对位置,也就是各个槽对应记录在页面中的地址偏移量
    槽:就是页面中每个组最打记录到页面的偏移量

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫果冻

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值