mysql行格式_MySQL 行格式

以 MySQL 默认的存储引擎 InnoDB 为例

InnoDB 包含以下四种行格式

Compact

Redundant

Dynamic

Compressed

指定行格式

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;

ALTER TABLE 表名 ROW_FORMAT=行格式名称;

示例:

创建一张表,指定行格式为 Compact

CREATE TABLE test_table (

c1 VARCHAR(10),

c2 VARCHAR(10) NOT NULL,

c3 CHAR(10),

c4 VARCHAR(10)

CHARSET=ascii ROW_FORMAT=COMPACT;

行格式类型

Compact

Compact 中一条完整的记录可以被分成 '记录的额外信息' 和 '记录的真实数据' 两部分

记录的额外信息

Compact 中记录的额外信息包含三类:变长字段长度列表、NULL 值列表、记录头信息

变长字段长度列表

MySQL 支持一些变长的数据类型 (VARCHAR),这些数据在存储时不仅要存储数据内容,还需要将占用的字节数存储起来

定长数据类型 (CHAR) 在以一些变长字符集储存数据时,由于储存长度为变长,所以也需要在该列表中存储其长度

在记录的开头部位就是各个变长字段占用的字节数,这些数据逆序存放

如果表中没有变长字段,就没有变长字段长度列表

NULL 值列表

NULL 值列表存储有表中所有 NULL 值,可以节约许多空间

值为 1 时,代表 NULL;值为 0 时,代表非 NULL。当位数不够整数个字节的时候,在高位补 0

所有数据逆序存放

如果表中没有允许储存 NULL 值的列,就没有 NULL 值列表

记录头信息

名称

大小 (bit)

描述

预留位1

1

没有使用

预留位2

1

没有使用

delete_mask

1

标记该记录是否被删除

min_rec_mask

1

B+树的每层非叶子节点中的最小记录都会添加该标记

n_owned

4

表示当前记录拥有的记录数

heap_no

13

表示当前记录在记录堆的位置信息

record_type

3

表示当前记录的类型,0 表示普通记录,1 表示B+树非叶子节点记录,2 表示最小记录,3 表示最大记录

next_record

16

表示下一条记录的相对位置

记录的真实数据

隐藏列

除了一些自定义列的数据外,MySQL 还会为每个记录默认添加一些隐藏列:

列名

是否必须

占用空间 (bit)

描述

DB_ROW_ID

6

行ID,唯一标识一条记录

DB_TRX_ID

6

事务ID

DB_ROLL_PTR

7

回滚指针

只有当用户没有指定主键,且表中没有 Unique 键时才会添加 DB_ROW_ID 作为主键

储存数据

当定长数据类型 (CHAR) 没有储存满时,剩下的位都由空格 (0x20) 填满

当使用变成字符集时,由于储存字节长度不一定,当占用字节数少的字符串变为占用字节数多的字符串时需要新开辟一个空间,会产生存储碎片

Redundant

记录的额外信息

字段长度偏移列表

Redundant 行格式会把该条记录中所有列 (包括隐藏列) 的长度信息都按照逆序存储到 '字段长度偏移列表' 中

储存的值为两个相邻数值的差值

所有数据逆序存放

记录头信息

名称

大小 (bit)

描述

预留位1

1

没有使用

预留位2

1

没有使用

delete_mask

1

标记该记录是否被删除

min_rec_mask

1

B+树的每层非叶子节点中的最小记录都会添加该标记

n_owned

4

表示当前记录拥有的记录数

heap_no

13

表示当前记录在页面堆的位置信息

n_field

10

表示记录中列的数量

1byte_offs_flag

1

标记字段长度偏移列表中每个列对应的偏移量是使用1字节还是2字节表示的

next_record

16

表示下一条记录的相对位置

记录的真实数据

存储数据

不管该列使用的字符集是什么,只要是使用 CHAR 类型,占用的真实数据空间就是该字符集表示一个字符最多需要的字节数和字符串长度

例如使用 utf8 字符集的 CHAR(10) 列占用的真实数据空间始终是 30 个字节

Dynamic & Compressed

MySQL 8.0 中默认的行格式为 Dymatic

这两个行格式与 Compact 只有在处理行溢出数据 (

Compressed 与 Dymatic 不同的一点是它会采用压缩算法对页面进行压缩,以节省空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值