前言
土人有土办法,利用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是如何构成的
关于这些头信息的解释可见文章 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信息需要消耗额外的字节数