MySQL行格式的实现

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

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

✅ 四种行格式

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

  • compact(紧凑)除了保存字段值外,还会记录头信息和记录变长字段长度列表,以及利用空值列表保存null值。适合处理大量包含可变长度列的数据,如:varchar、varbinarg、blob和text。(对于可变长序列,在真实数据处只会存储该列的前768字节的数据,超出的数据分散存储在其他几个页中。然后在真实数据处用20个字节存储指向溢出页的地址,从而可以找到剩余数据所在的页。这也就是我们常说的“行溢出”)

在这里插入图片描述

  • redundant(冗余)是MySQL5.0版本之前InnoDB的行记录存储方式,用的比较少。它会将该条记录中所有列(包括隐藏列)的长度信息都存储到“字段长度偏移列表”中。

在这里插入图片描述

  • dynamic(动态)是MySQL7.5版本引入,是compact格式的改进版,其结构与compact格式大致相同。它与compact格式的不同主要在于行溢出的处理,在真实数据处不再去额外记录一部分数据了,而是用20个字节存储指向溢出页的地址,所有的数据全部在溢出页中。这种设计减少了行中额外的开销,提高了存储效率和查询性能。

  • compressed(压缩)是MySQL5.1中InnoDB的新特性之一,它在dynamic的基础上面进行压缩处理,特别是对溢出页的压缩处理。在查询时,会自动解压数据并返回。但compressed格式其实也是用时间换空间,性能并不友好,不推荐在常见的业务中使用。

其中,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。

记录头信息

在这里插入图片描述

  • 预留位1【1bit】,没有使用;
  • 预留位2【1bit】,没有使用;
  • delete_mask【1bit】,标记该条记录是否被删除。我们执行delete删除记录时,记录并不会立刻被物理删除,而是将这条记录的delete_mask置为1;
  • min_rec_mask【1bit】,标识该条记录是否是某个非叶子节点页内的最小记录,帮助 InnoDB 管理索引页中的记录顺序和边界;
  • n_owned【4bit】,记录组内记录数。在页内为了快速二分查找,会分组,只有组内最大记录此字段有值,记录组内记录数;
  • heap_on【13bit】,用于标识记录在页内的逻辑位置。页内的记录会组成一个单链表,heap_on用于标识记录在链表中的位置。其中0和1,都是虚拟记录,表示页的最小和最大边界,实际记录位置从2开始递增;
  • record_type【3bit】,表示当前记录的类型;
    • 0 表示普通记录
    • 1 B+树非叶子节点记录
    • 2 最小记录
    • 3 最大记录
  • next_record【16bit】,表示下一条记录的相对位置。

真实数据部分

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

  • row_id【6Byte】:如果表中没有指定主键且没有唯一约束列,InnoDB会为记录添加row_id作为主键。如果表中有指定标识或者有唯一约束列,那么不会有row_id隐藏列;
  • trx_id【6Byte】:该字段是必须有的。事务id,表示这个数据是由哪个事务生成的;
  • roll_pointer【7Byte】:该字段也是必须有的。回滚指针,指向一条undo日志记录。

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

相关文章

  • MySQL数据库事务transaction示例讲解教程

    MySQL数据库事务transaction示例讲解教程

    这篇文章主要为大家介绍了MySQL数据库事务transaction的示例讲解教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • MySQL敏感数据进行加密的几种方法小结

    MySQL敏感数据进行加密的几种方法小结

    本文介绍了在MySQL中对敏感数据进行加密的几种方法,每种方法都有其适用场景和特点,可以根据具体需求选择合适的方法来保护数据安全,感兴趣的可以了解一下
    2024-11-11
  • MySQL Event Scheduler(事件调度器)

    MySQL Event Scheduler(事件调度器)

    事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功能。
    2010-06-06
  • MySQL8.0设置远程访问权限的方法

    MySQL8.0设置远程访问权限的方法

    这篇文章主要介绍了MySQL8.0设置远程访问权限的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 解决“无法启动mysql服务 错误1069”的方法

    解决“无法启动mysql服务 错误1069”的方法

    本文给大家分享的是小编解决自己网站无法连接数据库的时候遇到的“无法启动mysql服务 错误1069”的方案,有相同需求的小伙伴可以参考下
    2017-08-08
  • MySQL中随机生成固定长度字符串的方法

    MySQL中随机生成固定长度字符串的方法

    在MySQL中有时需要随机生成数字或字符串,随机生产数字可直接使用rand()函数,但是要随机生成字符串就比较麻烦。
    2010-12-12
  • 高性能MySQL读书笔记 找出谁持有锁

    高性能MySQL读书笔记 找出谁持有锁

    周末重读了一遍《高性能MySQL》,发现有些知识点看过便忘了,没有实际动手操作一遍就是记不牢,所以今天动手操作了一下“找出谁持有锁”,并把实验步骤记录下来,有兴趣的网友可以参照一二。
    2011-01-01
  • mysql 卡死 大部分线程长时间处于sending data的状态

    mysql 卡死 大部分线程长时间处于sending data的状态

    首先说明一下,这是个无头的案子,虽然问题貌似解决了,不过到现在我也没有答案,只是把这个问题拿出来晾晾
    2008-11-11
  • B-Tree的性质介绍

    B-Tree的性质介绍

    今天小编就为大家分享一篇关于B-Tree的性质介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • CentOS7.4 源码安装MySQL8.0的教程详解

    CentOS7.4 源码安装MySQL8.0的教程详解

    这篇文章主要介绍了CentOS7.4 源码安装MySQL8.0的教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04

最新评论