首页 > 其他分享 >Innodb行格式

Innodb行格式

时间:2023-07-01 19:56:12浏览次数:33  
标签:存储 段长度 字节数 列表 Innodb 格式 NULL

InnoDB行格式

InnoDB是一个将表中的数据存储到磁盘上的存储引擎。 为了方便磁盘与内存的读取,InnoDB以页的格式存储数据。我们可以通过 SHOW GLOBAL VARIABLES LIKE 'innodb_page_size'; 的方式查看页的大小。 一般来说,页的大小会设置为16384(16KB)。

我们以记录为单位向表中插入数据。 这些记录在磁盘存储的格式称为行格式或者纪录格式。 我们可以通过下面的方式指定或者修改表的行格式:

CREATE TABLE (TABLE NAME) (COLUMN INFORMATION) ROW_FORMAT=();
ALTER TABLE (TABLE NAME) ROW_FORMAT=();

行格式主要有四类:

  • COMPACT
  • REDUNDANT
  • DYNAMIC
  • COMPRESSED

COMPACT行格式

我们主要以COMPACT为例讲解。COMPACT行格式记录的信息包括记录的额外信息和记录的真实数据两部分,可以表示为

变长字段长度列表,NULL值列表,记录头信息 (额外信息)
列1的信息,列2的信息,……,列n的信息 (真实数据)

记录的额外信息

变长字段长度列表

顾名思义,这块主要以列表形式存储诸如VARCHAR(M), VARBINARY(M) ,各种TEXT类型,各种BLOB类型这样的变长数据类型数据的字节数。各变长字段的真实数据占用的字节数按照列的顺序逆序存放

那么如何确定表的最大长度呢?第一步一定是首先查看表结构,并确定某个变长字段运行存储的最大字节数。 之后比较理论最大字节数(即最多存储的字符数 × 字符集单字符最多需要的字节数)与允许的最大字节数进行比较。 如果超过且真实数据占用的字节超过允许最大字节数\2,那么用2字节表示真实数据占用的字节数。否则使用1字节。

注意:变长字段长度列表中只存储值为非NULL的列的内容长度。 同时,行格式里不是一定要有变长字段长度列表。 比如表中没有变长数据类型或者有但都为NULL,则不需要该列表。

NULL值列表

COMPACT行格式会把表中值为NULL的列统一管理,其过程如下:

1、 统计表中允许存储NULL的列。比如主键列以及用NOT NULL修饰的列是不允许存储NULL值的。 如果表中没有允许存储NULL的列,那么NULL值表就不存在了。
2、 对允许存储NULL值的列对应一个二进制位。 同样, 二进制位按照列的顺序逆序排序。二进制位的意义位:

  • 二进制位为1时, 代表该列的值为NULL
  • 二进制位为0时, 代表该列的值不为NULL

3、 NULL值列表必须以整数字节表示,如果非整需要采用高位补零。

记录头信息

记录头信息有5个字节(40个二进制位),用于描述记录的一些属性。

记录的真实数据

除了表中的原始数据, MySQL还会位某些表默认添加一些列,也就是所谓隐藏列。

列名 是否必需 占用空间 描述
DB_ROW_ID 6字节 行ID, 唯一标识一条记录
DB_TRX_ID 6字节 事务ID
DB_ROLL_PTR 7字节 回滚指针

DB_ROW_ID是针对如果用户没有指定主键列且也没有非NULL列(没有主键MySQL会选取一个不允许存储NULL的列作为主键)的情况下,MySQL会自动生成一个DB_ROW_ID列作为主键列。

REDUNDANT行格式

REDUNDANT行格式同样有两部分:

字段长度偏移列表, 记录头信息(额外信息)
列1的信息,列2的信息,……,列n的信息 (真实数据)

字段长度偏移列表

与变长字段长度列表相比:

  • 所有列(包括隐藏列)的长度信息读按照逆序存储到字段长度偏移列表
  • 采用两个相邻偏移量的差值来计算各个列值的长度

NULL值的处理

列对应的偏移量值的第一个比特位会标记该列是否位NULL,该比特位称为NULL比特位。

溢出列

页的大小一般是16KB,如果出现所需存取的数比页大小大的情况,就会出现所谓“溢出列”的现象。一般MySQL为了解决该问题,会把数据分散存在不同的页中。在行格式的真实数据处会用20字节存储指向这些页的地址。 MySQL规定一个页中至少存放两行记录。

标签:存储,段长度,字节数,列表,Innodb,格式,NULL
From: https://www.cnblogs.com/wyfc4/p/17519820.html

相关文章

  • U盘到底用什么格式好?FAT32、NTFS还是exFAT?
     装机小能手原账号名:“老毛桃winpe”,望大家多多支持哦!​关注 350人赞同了该文章说到U盘,相信很多朋友对它既熟悉又陌生,熟悉?无论是在学习中还是工作中,我们经常会用到;陌生?大家只知道U盘体积小巧,却能存储很多文件,但除此之外,你还知道什么呢?老毛桃相信不少......
  • java时间工具类型,格式化时间,最近7天 月初 月末 季度 月度 时间格式化
    常用java时间格式化:packagecom.tz.util;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;/***时间工具类最近7天月初月末季度月度时间格式化等等……**@description时间工具类*@author:tz*@dtate:......
  • 与用户交互- 格式化输出 - 基本运算符
    1、与用户交互'''python3'''与"python2"的区别:'''python3'''将获取到的用户输入赋值给变量名resres=input("请输入您的用户名")print(res,type(res))#id返回一串数字(可以看成是内存地址)type返回变量值的数据类型'''inpu......
  • 字符串格式化
    1.什么是字符串格式化?就是把字符串弄成⼀定的格式(往往就是留个位置,往里面填值)这个位置往往是格式符、占位符。2.字符串常见的3种格式化方式2.1格式符+%+变量/表达式2.2f'{变量或表达式}'也叫 f-strings 2.3 字符串对象的 format() 方法来格式化字符串3.格式......
  • MySQLINNODB表空间分类简单介绍
     MySQLINNODB表空间分类简单介绍 从功能上看INNODB表空间共以下几种:系统表空间File-Per-Table表空间通用表空间Undo表空间临时表空间 从共享与否角度看上边提到的五种表空间可以这么归类。共享表空间独立表空间官档中有明确提到“共享表空间”这个说法:http......
  • 使用numpy实现bert模型,使用hugging face 或pytorch训练模型,保存参数为numpy格式,然后使
     之前分别用numpy实现了mlp,cnn,lstm,这次搞一个大一点的模型bert,纯numpy实现,最重要的是可在树莓派上或其他不能安装pytorch的板子上运行,推理数据本次模型是随便在huggingface上找的一个新闻评论的模型,7分类看这些模型参数,这并不重要,模型占硬盘空间都要400+Mbert.embeddings.w......
  • LocalDateTime日期格式化和指定日期的时分秒
    LocalDateTime日期格式化和指定日期的时分秒packagecom.example.core.mydemo.date;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;/***now=2023-06-30*after=2023-07-04*afterTime=2023-07-04T00:00:0......
  • linux 系统mount的基本格式及用法
    1、https://help.aliyun.com/knowledge_detail/72719.html?spm=5176.10695662.1996646101.searchclickresult.748f3ea1mxowC42、mount的基本格式为mount[-tvfstype][-ooptions]devicedir。“-tvfstype”指定文件系统的类型,一般文件格式有以下几种。光盘或光盘镜像:iso9660。......
  • 陆探一号L1A级数据格式说明
    陆探一号的数据已经分发一段时间,SARscape5.6也已经支持该数据的处理(基本处理、InSAR处理)。本文简单介绍下陆探一号L1A级SLC数据格式供大家参考,如有不对请批评指正。产品描述(1)文件格式图像产品采用GeoTIFF格式。(2)图像产品命名产品命名包含了描述产品状态的基本信息,包括卫星标......
  • CSS颜色格式
    在CSS中,有多种常用的颜色格式可用于设置元素的颜色。以下是一些常见的颜色格式:十六进制颜色码(HexadecimalColorCodes):使用6位十六进制值来表示颜色,前两位表示红色(00-FF),中间两位表示绿色(00-FF),最后两位表示蓝色(00-FF)。例如,红色可以表示为#FF0000,绿色可以表示为#00FF00,蓝色可以表......