博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Mysql是怎样运行的》读书笔记四
阅读量:805 次
发布时间:2019-03-24

本文共 1128 字,大约阅读时间需要 3 分钟。

InnoDB是一个将表中数据存储到磁盘上的存储引擎,即使我们关闭并重启服务器,数据依然存在。InnoDB存储引擎并不是一条一条的把记录从磁盘上读出,而是将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位。

我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式或者记录格式InnoDB存储引擎现在已经有4种不同类型的行格式,分别是COMPACTREDUNDANTDYNAMICCOMPRESSED
主要讲一下COMPACT行格式:

变长字段长度列表 NULL值列表 记录头信息 列1的值 列2的值 ··· 列3的值

一条完整的记录可以成为记录的额外信息(变长字段长度列表,NULL值列表,记录头列表)和记录的真实数据(列1的值,列2的值,···,列3的值)。

1.记录的额外信息
(1)变长字段长度列表
MySQL支持一些变长的数据类型,比如VERCHAR(M),VARBINARY(M),各种TEXT类型,各种BLOB类型,变长字节字段存储多少个字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节页存起来。
COMPACT行格式中,所以变长字段的真实数据占用的字节数都存放在记录的开头位置,从而形成一个变长字段长度列表,各变长字段的真实数据占用字节数按着列的顺序逆序存放。
(2)NULL值列表
一条记录的某些列可能为NULL值,COMPACT行格式把一条记录中为NULL值的列统一管理起来。

  • 首先统计表中允许存储NULL值的列有哪些。
  • 如果表中没有允许存储NULL值的列,则NULL值的列表也不存在了,否则将每个存储NULL值得列对应一个二进制位,二进制位按着列的顺序逆序排列,二进制表示的意义如下:
    二进制位的值为1时,代表该列的值为NULL;
    二进制位的值为0时,代表该列的值不为NULL;
  • MySQL规定NULL值必须用整数个字节的位表示,如果使用的二进制位个数不是整个字节数,则字节的高位补0;

(3)记录头信息

记录头的信息由固定的5个字节组成,用于描述一些属性。
2.记录的真实数据
记录的真实数据除了我们自己定义的列的数据之外,MySQL会为每个记录默认的添加一些列(也称隐藏列),如下:

列名 是否必须 占用空间 描述
row_id 6字节 行ID,唯一标识一条记录
trx_id 6字节 事务ID
roll_pointer 7字节 回滚指针

从表中可以看出,InnoDB存储引擎会为每条记录都添加rx_idroll_pointer两个列,但是row_id是可选的(在没有自定义主键以及不允许存储NULL值得UNIQUE键的情况下才会添加该列)。

转载地址:http://auhkk.baihongyu.com/

你可能感兴趣的文章