MySQL---数据行 行溢出
引自:小林Coding--图解MySQL:
https://xiaolincoding.com/mysql/base/row_format.html
存储结构:数据行(row)----页(page 16KB)----区(extent 1MB)---段(索引段 数据段 回滚段)
变长字段(逆序存储 十六进制):记录数据长度
NULL字段(字节倍逆序存储 ):为空 置为1 非空为0 (例:三个数据(第二个非空)为空 00000101)
记录头信息(多条)示例:
delete_mask位(删除数据并不直接删除,将此位置为1)
next_record位 (下一条记录位置)
record_type位(0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录)
真实数据:
row_id(隐藏字段 6字节):有主键或唯一约束,则无row_id,否则InnoDB默认创建,非必须
trx_id(6字节):必须,事务
roll_ptr(7字节):必须,上一版本指针
varchar(n):除了类似 TEXT BLOBs的大对象类型之外,其他所有的列(不包括隐藏列和记录头信息,有变长字段长度列表和NULL值列表)占用长度不能超过 65535字节
单字段:字段允许为NULL(所有字段定义为 NOT),NULL值列表可以用1字节表示,变长字段列表(1.长字段最大字节数小于等于255字节,用1字节表示,大于255字节,为2字节)
因此单字段 varchar的n 最大为 65535 - 2 - 1 = 65532
多字段: 所有字段长 + 变长列表 + NULL列表 <= 65535
行溢出:
一个varchar(n)最多存储65532字节,单页16KB,为16384字节,单页存不了一条记录,发生 行溢出,多的数据会存储到另外的 溢出页 中
真实数据存储部分数据,其他溢出页地址:20字节
Compressed 和 Dynamic 采用完全溢出,真实数据不存储该列的部分数据,只存储 20字节的 溢出页地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)