表空间
共享表空间 独立表空间
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的谜团解开了
标签:存储,varchar,字节,innodb,mysql,空间,长度,磁盘,结构 From: https://www.cnblogs.com/bawanglong168/p/16948311.html