-
概述
我们知道InnoDB类型存储引擎的表都是有主键的(参考索引组织表),为了提高检索效率,会使用主键和表数据构建为一颗B+Tree,非叶子节点存储主键,叶子节点存储表数据,每个叶子节点是以页来存储的,页也就包含一个记录集合(表的多条记录),组成的这样一个数据结构也就是索引。然后我们下来来分析的就是这个索引中,叶子节点(页)中每条存储记录(行记录)的结构是怎样的?这里我举例一种格式(有多种格式,compact是默认的存储格式)。 -
查看表行记录采用的存储格式
ROW_format字段的值为 Compact ,在创建表的时候最好加上 row_format=compact版本变化问题 -
compact数据结构
-
案例分析
1.创建表,将行数据格式声明为compact
t1,t2,t4都是可变长字段,t3为固定长度字段
2.插入记录
看到,故意将第三条记录放置两个null
3.将表空间文件(参考表空间文件)转换为16进制文件,并且重定向为新文件
4.拷贝到windows本地,使用Notepad++打开,检索0000c070
5.分析
03 0a 02 01 :这个需要倒顺序看,01表示第一个字段是一个字节长度,以此类推
00:这个用于表示具体第几个字段是否为null
00 00 10 00 2d:这五个字节表示记录头
00 00 00 00 80 00:这个表没有主键,因此帮我们创建了这六个字节的主键
00 00 00 01 17 0c:这六个字节表示事务id
ac 00 00 01 20 01 10:这七个字节表示回滚指针列
61:第一个数据列值 a
62 62:第二个数据列值 bb
62 62 20 20 20 20 20 20 20 20:第三个数据列值 bb,固定长度类型,用20(空白字符)填充
63 63 63:第四个数据列数据ccc
到这里第一条行数据就分析完了,后面就是第二条行数据了
三个箭头表示三条记录开始的地方,三个下划线就是因为我们没有创建的主键,自动创建了_rowid作为主键,而且我们看 08 00 | 08 01 | 08 02也是自动增长的 -
总结:
a.字段长度列表这个字段最大可以用两个字节表示,因此每个字段理论上最大字节数为65536
b.标志非空字段用一个字节表示,因此理论上一张表最多可以有255个列
c.不管是char还是varchar类型字段,如果为null,不占用字节(空间)
相关文章: