关于编码
- 在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 行格式适用于许多常见的数据库工作负载,并且在大多数情况下提供了良好的性能。
变成字段长度列表
举例:c1,c2,c4为varchar类型
变长字段长度列表 就是用来记录一行中所有变长字段的真实数据所占用的字节长度,并且各变长字段数据占用的字节数是按照列的顺序
逆序存放。
即:变成列表展示位 01 03 04(逆序存放)
- 若变长字段的长度小于 255字节,就用
1字节表示;若大于 255字节,用2字节表示,最大不会不超过2字节,因为MySQL中VARCHAR类型的最大字节长度限制为65535。
记录头信息
一共5个字节,即:40位的二进制
记录的真实数据
参考学习网站:juejin.cn/post/697093…
每行数据除了用户定义的列外,在开头还有两个隐藏列,事务ID列(DB_TRX_ID)和回滚指针列(DB_ROLL_PTR),分别为6字节和7字节的大小。若InnoDB表没有定义主键,每行还会增加一个6字节的行ID列(DB_ROW_ID)。
关于varchar的总结
- 一行数据,除了 TEXT、BLOB 等大对象类型,总长度最大
65535字节。而且这个 65535 最大长度是包含变长字段长度列表、NULL值列表的。 VARCHAR(M)中的 M 指的是字符长度,而不是字节长度,计算时,要用总长度除以字符集最大长度,例如 utf8mb4 字符集每个字符的最大长度为 4字节。- VARCHAR 类型如果小于255字节,要在变长字段长度列表占
1字节,否则占2字节;如果可为NULL,还要在NULL值列表占1字节,不过这一个字节可以存8个可为NULL的列的状态。所以一个 VARCHAR(M) 的字节长度最大为65532字节。