• 概述
    我们知道InnoDB类型存储引擎的表都是有主键的(参考索引组织表),为了提高检索效率,会使用主键和表数据构建为一颗B+Tree,非叶子节点存储主键,叶子节点存储表数据,每个叶子节点是以页来存储的,页也就包含一个记录集合(表的多条记录),组成的这样一个数据结构也就是索引。然后我们下来来分析的就是这个索引中,叶子节点(页)中每条存储记录(行记录)的结构是怎样的?这里我举例一种格式(有多种格式,compact是默认的存储格式)。

  • 查看表行记录采用的存储格式
    ROW_format字段的值为 Compact ,在创建表的时候最好加上 row_format=compact版本变化问题
    (十)mysql常用命令之InnoDB行记录格式

  • compact数据结构
    (十)mysql常用命令之InnoDB行记录格式

  • 案例分析
    1.创建表,将行数据格式声明为compact
    (十)mysql常用命令之InnoDB行记录格式
    t1,t2,t4都是可变长字段,t3为固定长度字段
    2.插入记录
    (十)mysql常用命令之InnoDB行记录格式
    看到,故意将第三条记录放置两个null
    3.将表空间文件(参考表空间文件)转换为16进制文件,并且重定向为新文件
    (十)mysql常用命令之InnoDB行记录格式
    4.拷贝到windows本地,使用Notepad++打开,检索0000c070
    (十)mysql常用命令之InnoDB行记录格式
    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
    到这里第一条行数据就分析完了,后面就是第二条行数据了
    (十)mysql常用命令之InnoDB行记录格式
    三个箭头表示三条记录开始的地方,三个下划线就是因为我们没有创建的主键,自动创建了_rowid作为主键,而且我们看 08 00 | 08 01 | 08 02也是自动增长的

  • 总结:
    a.字段长度列表这个字段最大可以用两个字节表示,因此每个字段理论上最大字节数为65536
    b.标志非空字段用一个字节表示,因此理论上一张表最多可以有255个列
    c.不管是char还是varchar类型字段,如果为null,不占用字节(空间)

相关文章: