【Mysql】 InnoDB引擎深入- 行格式

15 篇文章 0 订阅
11 篇文章 0 订阅

        前面已经介绍了InnoDB的数据页结构,我们已经了解了InnoBD种数据和索引的存储结构以及页的概念。现在我们知道了数据库数据是以行存储在页种user record中的,那么现在就来了解下表的行格式。

​ 根据官方描述:

​ 表的行格式决定了其行的物理存储方式,这反过来又会影响查询和 DML 操作的性能。随着更多的行适合单个磁盘页面,查询和索引查找可以更快地工作,缓冲池中需要更少的高速缓存,并且需要更少的 I/O 来写出更新的值。

​ 可变长度列是列值存储在 B 树索引节点中的规则的一个例外。太长而无法放入 B 树页面的可变长度列存储在单独分配的磁盘页面上,称为溢出页面。此类列称为离页列。页外列的值存储在溢出页的单链表中,每个这样的列都有自己的一个或多个溢出页的列表。根据列长度,所有或可变长度列值的前缀都存储在 B 树中,以避免浪费存储空间并不得不读取单独的页面。

存储引擎支持四种行InnoDB格式:REDUNDANTCOMPACTDYNAMICCOMPRESSED,默认DYNAMIC

表 14.9 InnoDB 行格式概述

行格式紧凑的存储特性增强的可变长度列存储大索引键前缀支持压缩支持支持的表空间类型所需文件格式
REDUNDANTsystem, file-per-table, generalAntelope or Barracuda
COMPACT是的system, file-per-table, generalAntelope or Barracuda
DYNAMIC是的是的是的system, file-per-table, generalBarracuda
COMPRESSED是的是的是的是的file-per-table, generalBarracuda

当前引擎中默认行格式为DYNAMIC(动态的),几种行格式基础格式差异不大,根据官网描述:

DYNAMIC行格式是行格式的一种变 体COMPACT。有关存储特性,请参阅 COMPACT 行格式存储特性

那我们就直接看下COMPACT 行格式:

我们向数据库插入一条数据,那么这条数据在磁盘上的存储格式是什么样的呢?

大致介绍下相关内容:

1、变长字段宽度列表(2字节):对于可变长度列的长度时不固定的,该列表用于记录可变列长度字段长度。占用1~2字节。如果行中不存在可变长度列,则栏位不创建不占用空间。

2、null值列表(1~2字节):用于记录null值字段表标识,举个例子:如果插入的数据为 A - null - B 三个字段值,其实行真实数据中存储的是AB,而这次null列表中存储:101 (1代表非null,0标识null),最后查询根据两者的关系确定null值。这样做的目的也是为了节省空间,毕竟使用占位符代替null或者其他方式都是需要消耗空间的。同样的如果行中不存在null值列,即所有列都设置为not null时,该null值列表也不会创建。

3、记录头信息(5字节):记录头信息主要记录着这条数据的一些信息,如下:

  • delete-flag:是否删除,在数据库中进行delete操作,其实并不会立马从磁盘上删除的,而是进行删除标记。在空余时间再进行删除处理。( truncate和drop语句就是直接删除)
  • record_type :表示该条记录的类型,因为页中有很多数据,类型可能都不一样,比如:

            ----   000 表示普通记录

            ----   001 表示b+树非叶子节点的目录项记录

            ----   010 表示infimum记录(即一页中最小的记录)

            ----   011 表示supremum记录(即一页中最大的记录)

            ----   1** 保留

  • next_record:表示指向下一条记录的地址指针(innodb中可以通过一条记录找到下一条记录就是通过这个指针实现的)
  • n_owned:记录该组数据条数,上面数据页结构说过了,一个数据页为了优化会分为n个组,将每个组的最小主键作为"key" ,该类型数据n_owned则记录着本组的所有条数,而其他数据则都为0。
  • 4、row_id(6字节):InnoBD引擎下,创建表时没有创建主键或者没有唯一索引的情况下,会默认生成row_id字段作为主键,占有6字节。如果已存在可作为主键字段,则不会创建该字段。
  • 5、trx_id(6字节) :记录最近修改本条记录的事务ID.
  • 6、roll_pointer(7字节):滚动指针字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Survivor001

你可以相信我,如果你愿意的话

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值