接下来的部分是记录头信息(record header),固定占用5 字节(40 位) 。每位含义见表:

文章插图
最后的部分就是实际存储每个列的数据 。
需要特别注意的是,NULL 不占该部分任何空间,即 NULL 除了占有 NULL 标志位,实际存储不占有任何空间 。另外有一点需要注意的是,每行数据除了用户定义的列外,还有两个隐藏列,事务 1D 列和回滚指针列,分别为 6 字节和 7 字节的大小 。若 InnoDB 表没有定义主键,每行还会增加一个 6 字节的 rowid 列 。
Redundant 是 MySQL 5 . 0 版本之前 InnoDB 的 行 记 录 存 储 方 式,这里就不展开 。
2.2、行溢出数据InnoDB 存储引擎可以将一条记录中的某些数据存储在真正的数据页之外 。因为一般数据页默认大小为16KB,假如一个数据页存储不了插入的数据,这时肯定就会发生行溢出 。

文章插图
一般认为 BLOB、LOB 这类的大对象列类型的存储会把数据存放在数据页之外 。但是,BLOB 也可以不将数据放在溢出页面,而且即便是 VARCHAR 列数据类型,依然有可能被存放为行溢出数据 。
3、InnoDB 数据页结构页是 InnoDB 存储引擎管理数据库最小磁盘单位 。页类型为 B-tree Node 的页存放的即是表中行的实际数据了 。
InnoDB 数据页由以下 7 个部分组成:
- File Header (文件头)
- Page Header (页头)
- Infimun 和 Supremum Records
- User Records (用户记录,即行记录)
- Free Space (空闲空间)
- Page Directory (页目录)
- File Trailer (文件结尾信息)

文章插图
其中 File Header、Page Header、File Trailer的大小是固定的, 分别为 38、56、8 字节,这些空间用来标记该页的一些信息,如 Checksum, 数据页所在 B+ 树索引的层数等 。User Records、Free Space、Page Directory 这些部分为实际的行记录存储空间,因此大小是动态的 。
【MySQL高级进阶:关于InnoDB存储结构,一文深入分析讲解】
推荐阅读
- MYSQL5.7安装教程
- MySQL 5.6.28修改root用户密码(windows)
- App反爬虫 Python高级反爬虫类型
- MySQL深度分页:数千万的数据如何快速分页?
- 爆破SSH/MySQL账户竟如此简单
- CentOS7下MySQL数据库服务器的安装和配置
- 看了这篇MySQL,开发功力又升级
- mysql导入导出命令
- MySQL Explain详解,添加索引sql优化
- Mysql建立、删除索引及使用
