Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL行格式

MySQL行格式的实现

作者:HGW689

本文主要介绍了MySQL行格式的实现,行格式包含了行格式包括compact、redundant、dynamic和compressed四种,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

首先我们知道在MySQL中是数据读写的最小单元,默认是16KB。页内的记录会组成一个单链表,每条记录就是一行数据,行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。

✅ 四种行格式

在InnoDB中,常见的行格式有以下4种:

在这里插入图片描述

在这里插入图片描述

其中,MySQL 5.6 之前默认使用 Compact,MySQL 5.7 默认使用Dynamic,而redundant 是比较老的数据格式,compressed 不能应用在系统数据,所以Compact和Dynamic应用较广泛;

✅ 如何指定行格式?

我们可以在创建表的时候指定行格式,或者在表创建之后通过 alter 命令更改表的行格式。

// 创建表指定行格式
CREATE TABLE 表名( 
  建表语句; 
) row_format = 行格式名称;
// 修改表的行格式
alter table 表名 row_format = 行格式名称;

✅ 详细谈谈compact行格式

在这里插入图片描述

如上图,compact行格式分为四段,分别是:变长字段长度列表+NULL值列表+记录头信息+列值。

变长字段长度列表

 char和varchar的区别就是定长和变长,对于变长字段实际存储的数据的长度是不固定的,所以在存储数据的时候也要将数据占用的大小存储起来。也就是,变长列的实际占用字节数以逆序方式存储在变长字段长度列表中。

为什么要逆序存放?

那是因为记录头信息指向下一个记录的指针,指向的是下一条记录的记录头和真实信息之间的位置,这样使得位置靠前的记录真实数据 和 对应的字段长度信息可以同时在一个 CPU缓存中,这样就可以提高CPU缓存命中率

NULL值列表

 表中的某些列可能会存储NULL值,如果把这些NULL值都放在记录的真实数据中会比较浪费空间,所以compact行格式把这些值为NULL的列存储到NULL值列表中。如果存在允许 null 值的列,则每个列对应一个二进制位(bit),值为1则代表NULL,0则非空,二进制位按照列的顺序逆序排序列。另外,NULL值列表必须用整个字节的位表示(1个字节8位),如果二进制位个数不足整数个字节,则高位补0。

记录头信息

在这里插入图片描述

真实数据部分

记录真实数据部分,但需要注意的是~除了我们定义的字段外,还有三个隐藏字段,分别是row_id、trx_id、roll_pointer。

到此这篇关于MySQL行格式的实现的文章就介绍到这了,更多相关MySQL行格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文