MySQL 单行数据的最大存储限制,并非一个固定值,而是由存储引擎、页大小、行格式、列类型共同决定的动态上限。
一、InnoDB 行大小硬限制
1.官方文档定义
- 最大行大小:略小于 16KB 的页大小(默认 16,384 字节)
- 实际可用空间:
≈ 8,000 字节(因页头/尾、系统列、预留空间占用)
✅关键公式:
有效行大小 ≤ 16,384 - 页开销(~200B) - 系统列(13B) - 预留空间(~7,000B)
2.为什么不是 16KB?
- 页结构开销:
- 页头/尾:约 120 字节
- 事务ID + 回滚指针:13 字节
- NULL 位图:
(列数+7)/8字节 - 变长字段长度列表:1~2 字节/字段
- 预留空间:
InnoDB 为行更新预留约 50% 页空间(防页分裂)
⚠️实测上限:
单行总数据(不含溢出)≤ 7,950 字节(MySQL 8.0)
二、突破限制:溢出页(Off-page Storage)
当行数据超过阈值,InnoDB 自动将大字段存入溢出页(Overflow Pages):
| 列类型 | 溢出阈值 | 存储方式 |
|---|---|---|
| TEXT/BLOB | > 768 字节 | 主键页存 20 字节指针,数据存独立页 |
| VARCHAR | > 768 字节 | 同 TEXT |
| JSON | 总大小 > 768 字节 | 同 TEXT |
✅效果:
逻辑行大小无硬上限(受限于innodb_page_size和磁盘空间)
示例:
CREATETABLEt(idINTPRIMARYKEY,contentLONGTEXT-- 可存 4GB 数据);- 主键页:仅存
id+ 20 字节指针 - 溢出页:
content数据分散在多个 16KB 页中
三、各列类型的存储上限
| 类型 | 最大值 | 磁盘占用 |
|---|---|---|
| TINYINT | 1 字节 | 1B |
| INT | 4 字节 | 4B |
| BIGINT | 8 字节 | 8B |
| VARCHAR(N) | 65,535 字节 | 实际长度 + 1~2B 长度前缀 |
| TEXT | 65,535 字节 | 同 VARCHAR |
| MEDIUMTEXT | 16MB | 指针 + 溢出页 |
| LONGTEXT | 4GB | 指针 + 溢出页 |
| JSON | ≈ 1GB | 以 TEXT 形式存储 |
⚠️注意:
所有列总和 ≤ 65,535 字节(MySQL 行格式限制,非 InnoDB)
四、行格式(ROW_FORMAT)的影响
| 格式 | 溢出策略 | 适用场景 |
|---|---|---|
| COMPACT | > 768 字节溢出 | 旧版本兼容 |
| DYNAMIC | 所有大字段直接溢出 | 推荐!减少主键页碎片 |
| REDUNDANT | 已废弃 | — |
✅最佳实践:
CREATETABLEt(...)ROW_FORMAT=DYNAMIC;
五、极端情况测试
1.最大单行(无溢出)
-- 创建接近 8KB 的行CREATETABLEmax_row(c1VARCHAR(7000),c2VARCHAR(900))ROW_FORMAT=DYNAMIC;- 插入:
INSERT INTO max_row VALUES (REPEAT('a',7000), REPEAT('b',900)); - 结果:成功(总 ≈ 7,900B)
2.最大单行(含溢出)
-- 存储 1GB JSONCREATETABLEhuge_json(idINTPRIMARYKEY,dataJSON)ROW_FORMAT=DYNAMIC;INSERTINTOhuge_jsonVALUES(1,LOAD_FILE('/path/to/1gb.json'));- 结果:成功(主键页仅存指针)
六、生产建议
避免宽表:
- 单行 > 4KB 会降低 Buffer Pool 效率
- 将大字段拆到单独表
强制 DYNAMIC 格式:
SETGLOBALinnodb_file_format=Barracuda;SETGLOBALinnodb_file_per_table=ON;CREATETABLEt(...)ROW_FORMAT=DYNAMIC;监控溢出页:
-- 查看溢出页使用SELECT*FROMINFORMATION_SCHEMA.INNODB_SYS_TABLESPACESWHERENAME='your_db/your_table';
总结
- 物理行上限:≈ 8,000 字节(主键页内)
- 逻辑行上限:4GB(通过溢出页)
- 工程原则:
“单行越小,Buffer Pool 效率越高;大字段必须溢出”。
用ROW_FORMAT=DYNAMIC+ 拆分宽表,方能兼顾容量与性能。