浅析InnoDB Record Header及page overflow

本文探讨了InnoDB存储引擎的Record Header结构,分析了变长列数量、NULL值属性对Record Header的影响,并介绍了page overflow的情况。通过实例展示了不同数据类型如何影响Record Header的大小,并提供了测试验证过程。
摘要由CSDN通过智能技术生成

640?wx_fmt=png


前言

土人有土办法,利用innodb_ruby观测验证innodb page header及overflow临界点。

这是一篇封存了两年的文章,最近拿出来重新整理发布。

1、背景信息

1.1 InnoDB Diagrams项目

首先看一下Jeremy Cole、Davi Arnaut两位大神联合维护的牛逼项目:InnoDB Diagrams

在这个项目中,详细介绍了InnoDB引擎数据结构、日志结构,以及InnoDB内部的运行机制。

为了配合这个项目,二位大神还开发了一个InnoDB数据文件解析工具 innodb_ruby

1.2 InnoDB Record Header

InnoDB Diagrams项目中有一张图介绍了InnoDB record header是如何构成的

640?wx_fmt=png


关于这些头信息的解释可见文章 The physical structure of records in InnoDB,本文不赘述。

简言之,记住几条关键规则

  • 一条记录的record header,至少是5字节
  • 对record header影响最大的是变长列数量,及其是否允许为NULL的属性
关于变长列
  • 每个变长列,如果列长度 <128 字节,则需要额外1字节
  • 每个变长列,如果列长度 >=128 字节,则需要额外2字节
  • 如果没有任何变长列,则无需这额外的1-2字节
  • 变长类型为char/varchar/text/blob等

同学们可能会诧异,char为什么也当做变长类型了?这是因为,当字符集非latin1时,最大存储长度可能会超过255字节,例如 char(65) utf8mb4 最长就可以存储260字节,此时在record header中需要用2字节来表示其长度,因此也被当做变长类型了

关于列允许为NULL
  • 每个列如果允许为NULL,则增加 1bit,不足8bit也需要额外1字节
  • 例如只有2个列允许为NULL,只需要2bit来表示,但也需要占用1字节

P.S,在InnoDB的存储结构里,从tablespace到segment,再到extent、page,还是file层面,总有各种必要的header或trailer信息需要消耗额外的字节数࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值