mysql学习(一)InnerDb行格式简介

118 阅读3分钟

关于编码

  • 在UTF-8编码下,一个中文字通常占用3个字节,而在UTF-8mb4编码下,一个中文字会占用4个字节。

InnoDB存储引擎

  • InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的
  • 真正处理数据是在内存处理的,需要把磁盘的数据放入内存处理,处理写或者修改后,将数据写回磁盘
  • 读写磁盘的数据是非常慢的,innoDB是通过将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16 KB
  • 一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。

InnoDB行格式

到现在为止设计了4种不同类型的行格式,分别是Compact、Redundant、Dynamic(默认5.7)和Compressed行格式

# 查询行格式默认
show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+

Compact

它会在每个数据行中存储尽可能少的元数据,以减小存储空间的占用。COMPACT 行格式适用于许多常见的数据库工作负载,并且在大多数情况下提供了良好的性能。

image.png

变成字段长度列表

举例:c1,c2,c4为varchar类型

image.png

image.png 变长字段长度列表 就是用来记录一行中所有变长字段的真实数据所占用的字节长度,并且各变长字段数据占用的字节数是按照列的顺序逆序存放

image.png 即:变成列表展示位 01 03 04(逆序存放)

  • 若变长字段的长度小于 255字节,就用1字节表示;若大于 255字节,用2字节表示,最大不会不超过2字节,因为MySQL中VARCHAR类型的最大字节长度限制为65535

记录头信息

一共5个字节,即:40位的二进制

image.png

记录的真实数据

参考学习网站:juejin.cn/post/697093…
每行数据除了用户定义的列外,在开头还有两个隐藏列,事务ID列(DB_TRX_ID)回滚指针列(DB_ROLL_PTR),分别为6字节7字节的大小。若InnoDB表没有定义主键,每行还会增加一个6字节行ID列(DB_ROW_ID)

image.png

关于varchar的总结

  • 一行数据,除了 TEXT、BLOB 等大对象类型,总长度最大 65535字节。而且这个 65535 最大长度是包含 变长字段长度列表NULL值列表 的。
  • VARCHAR(M) 中的 M 指的是字符长度,而不是字节长度,计算时,要用总长度除以字符集最大长度,例如 utf8mb4 字符集每个字符的最大长度为 4字节。
  • VARCHAR 类型如果小于255字节,要在变长字段长度列表占 1字节,否则占 2字节;如果可为NULL,还要在NULL值列表占 1字节,不过这一个字节可以存8个可为NULL的列的状态。所以一个 VARCHAR(M) 的字节长度最大为 65532字节