mysql存储结构

表空间

 

共享表空间     独立表空间

https://www.cnblogs.com/wt645631686/p/8258070.html  

偷一手,先贴个链接 感谢这位爷

innodb_file_per_table 参数设置是否开启独立表空间

 

开启独立表空间  每个表会有一个.idb文件用于存储数据

同时在共享表空间里面 会放一些该表的其他信息

如果启用了innodb_file_per_talbe参数,需要注意的是每张表的表空间内存放的只是数据、索引和插入缓冲Bitmap页,其他数据如:回滚信息、插入缓冲索引页、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的共享表空间内。同时说明了一个问题:即使启用了innodb_file_per_table参数共享表空间还是会不断的增加其大小的。

https://www.cnblogs.com/shamo89/p/8664982.html

独立表空间的优缺点   大概看一下,并不理解

 

innodb_file_per_table

独立表空间是否开启的参数

 

 

 

段  区  页

 

 

 

 

数据段 b加树的叶子节点

索引段 b加树的非叶子节点    具体页不懂  先记一下   还有回滚段  大概是用于undo的

 

区由连续的页组成  大小固定为1MB

 

 

页的最大行数为   page_size    一般为 16KB 

16KB/2 - 200=7992

这个没找到详细的推理过程   我猜测   将一个表的所有隐藏列删除  只剩下一个主键  

然后 根据编码集合 给他来了个两字节大小的类型 比如 int16  还有两百字节要存储一些其他东西

 

晚网上偷了一个图   但是其他信息加起来也只有128字节

 

 

 

又查了一下   最大行数和页大小无关   上面那些猜测全是错的   最大行数7992 是规定  硬性规定

 

 

 

 

 

关于varchar

首先 varchar 在磁盘中和在内存中的区别

因为varchar 在磁盘中 记录的是真实长度+额外信息  比如 长度  innodb用两个字节存储长度 所以 varchar类型的最大长度是 2的16次方-1 字节  注意单位是字节

varchar类型在内存中占据的是实际声明的长度,猜测是更新数据时,不确定数据长度,需要按照声明长度给位置,不然位置不够造成页分裂之类的更麻烦

同时 声明的varchar类型字段长度单位的字符  这跟编码集有关  例如 utf8mb4 一个字符长度为4个字节   所以 varchar最大长度大约是  2的16次方除以四   比这个理论数稍微小一些,

因为还要额外存一些信息

 

再次值得一提,varchar长度指的是所有变长字段列加起来的和  ,不是单个字段的长度

 

 

 

 

compact 行记录格式

变长字段长度列表(一个或两个字节。小于255一个字节,大于255两个字节)//null标志位//记录头信息//列1//列2.。。

 变长字段表  列的逆序

变长字段长度表的存储方式给我整蒙了,怎么算数量都不对,tnnd

还有行溢出现象

但是有个问题 ,在硬盘只记录实际长度,如果varchar 字段 更新,长度从5变成500,会在磁盘中造成页分裂或其他问题?是怎么解决的呢?等待学习

 

varchar在内存中占声明长度,在磁盘中占实际长度,

页内部通过链表结构串联各个行记录。

compact的行记录格式

 

 

 

 

 

 

内存中的记录页在磁盘中是连续的吗?

一顿狂查 找到了这么一句话 

innodb数据页结构

user records,free space,page directory 这些部分为实际行记录存储空间,因此大小是动态的。  出自mysql 技术内幕  第 120 页  最下面

指的是页大小是动态还是其他的。

 

 

我认为指的是页大小是动态的,例如 一个页在物理磁盘上大小是 9KB

但是varchar声明的长度比较长   在内存中处理后变成了16KB

但是如果数据更新后大小为14KB,这么处理呢?

至少把varchar的谜团解开了

 

posted @ 2022-12-04 15:32  霸王龙168  阅读(139)  评论(0)    收藏  举报