InnoDB 页
InnoDB是一个存储引擎,将表中的数据存储到磁盘上,处理数据的锅中发生在内存中,需要把磁盘中的数据加载到内存中。
InnoDB将数据划分为若干个页,以页作为磁盘和内存之间的基本交互单位。InnoDB的页大小一般为16KB,一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把16KB内容刷新到磁盘中。
InnoDB 行格式
InnoDB的行格式分别是COMPACT、REDUNDANT、DYNAMIC、COMPRESSED,这些格式在原理上答题都是相同的。
指定行格式的语法
在创建、修改数据表的时候,可以显式地指定row format行格式。SQL语句语法如下
-- 创建数据表时,显示指定行格式
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;
-- 创建数据表时,修改行格式
ALTER TABLE 表名 ROW_FORMAT=行格式名称;
与此同时,如果需要查看某数据表的行格式,可通过如下语句实现
show table status from 数据库名 like '<数据表名>';
COMPACT 行格式
分为额外信息和记录的真实数据两大部分。
额外的信息
分为3个部分:变长字段长度列表、NULL值列表、记录头信息
(1)变长字段长度列表
mysql支持一些变长的数据类型,比如varchar、varbinary、text类型、blob类型,这些数据类型的列叫变长字段,存储真实数据的同时需要把这些占用的字节数也存起来。- 真正的数据内容
- 占用的字节数
个变长字段的真实数据按占用字节数按照列的顺序逆序存放
引入 W、M、L
- 假设某个字符集做多需要W字节来表示一个字符,MaxLen 列
- 对于变长类型varchar(M) 最多能存储M个字符,占用的最多字节数是M×W
- 假设变长字段实际存储的字符串占用的字节数是L
规则:
- 如果M×W ≤ 255,那么使用1字节来表示真实数据占用的字节数
InnoDB在读取记录的变长字段长度列表事先查看表结构,如果某个变长字段允许存储的最大字节数不大于 255,可以认为只是用1字节来表示真实数据占用的字节数。
如果M×W > 255,两种情况
- L ≤ 127,使用1字节表示真实数据占用的字节数
- L > 127,使用2字节表示真实数据占用的字节数
一句话总结:如果该变长字段允许存储的最大字节数 (M×W )超过255字节,并且真实数据占用的字节数L超过127字节则使用2字节来表示真实数据占用的字节数 否则使用1字节
如果没有变长字段,或者所有值的列表都是NULL的话 ,不需要有变长字段长度列表。
(2) NULL值列表
COMPACT行格式把一条记录中值为NULL的列同意管理起来,存储到NULL值列表中
- 首先统计表中允许存储NULL的列有哪些。
主键列以及使用NOT NULL修饰的列都是不可以存储NULL值的,忽略。 - 如果没有能存储NULL的列 NULL值列表不会存在,否则对应一个二进制位,按照列的顺序逆序排序。1为NULL,0不为NULL
NULL值列必须使用整数个字节的位表示,高位补0
(3) 记录头信息
占用5字节。
前4个位被称为info bit.。
2.记录真实数据
MySQL会为每个记录默认的添加一些列(隐藏列)
除了建表时定义的几个列,mysql会为每一行记录都添加几个隐藏列
列名 | 是否必需 | 功能 |
---|---|---|
row_id | 否 | 主键 |
trx_id | 是 | 事务ID |
roll_pointer | 是 | 回滚指针 |
InnoDB的主键生成策略:如果表中连不允许存储NULL值的UNIQUE建都没有定义,则InnoDB回味表默认添加一个名为row_id的隐藏列作为主键。
CHAR(M)列的存储形式
在compact行格式习啊,变长字段长度列表只是用来存放一条记录中各个变长字段的值占用的字节长度的。
对于CHAR(M)类型的列来说,当列采用的是定长编码的字符集时,该列占用的字节数不会被加到变长字段长度列表;如果采用变长编码的字符集时,该列占用的字节数就会被加到变长字段长度列表。采用变长编码的字符集的CHAR 类型的列至少占用M个字节
REDUNDANT行格式
TODO