MySQL行格式COMPACT和DYNAMIC到底有什么区别
MySQL 表的行格式(ROW_FORMAT)
用于控制数据在磁盘上的存储方式,不同格式会影响存储空间、性能及兼容性。常见的行格式包括:
1.ROW_FORMAT=DEFAULT
说明:默认行格式,取决于表使用的存储引擎。
- InnoDB 5.7 及之前默认是
COMPACT,8.0 后默认是DYNAMIC。 - MyISAM 默认是
REDUNDANT(旧格式,兼容性强但空间效率低)。
2.ROW_FORMAT=COMPACT
存储特点:
- 紧凑格式,数据行头部使用二进制表示字段长度,占用空间较少。
- 对于变长字段(如
VARCHAR),字段长度信息存储在行头部,若字段长度超过 255 字节,用 2 字节存储长度;否则用 1 字节。
适用场景:
- 需要节省存储空间且无大字段(如超长字符串)的场景。
3.ROW_FORMAT=DYNAMIC
存储特点:
与 COMPACT 类似,但针对大字段(如 TEXT/BLOB)优化:
- 大字段的前 768 字节数据存储在数据页中,超过部分存储在溢出页(off-page),数据页仅保留溢出页指针。
- 字段长度信息始终存储在数据页,不随字段长度变化而占用更多字节。
优势:
- 减少大字段对数据页的占用,提升数据页利用率和查询性能。
4.ROW_FORMAT=REDUNDANT
说明:
- 旧版行格式,字段长度信息使用非二进制方式存储,兼容性强但空间效率低,仅用于兼容旧版本 MySQL。
5.ROW_FORMAT=COMPRESSED
说明:
- 压缩格式,使用
zlib压缩数据行,适用于 read-only 表或历史数据归档,节省存储空间但增加 CPU 开销。
为什么ROW_FORMAT=COMPACT报错,而DYNAMIC不报错?
常见报错场景:
当表中存在 大字段(如 VARCHAR(65535)、TEXT 等)或 多变长字段 时,可能出现以下问题:
1.COMPACT格式报错原因
行数据长度限制:
- InnoDB 数据页默认大小为 16KB,
COMPACT格式下,行数据(包括头部、字段数据、NULL 值标识等)需全部存储在数据页中。 - 若行数据总长度超过数据页剩余空间(约 16KB - 页头开销),会触发
Row size too large错误(如Error 1118: Row size too large)。
变长字段长度存储限制:
COMPACT格式中,变长字段长度需占用 1 或 2 字节,若表中有多个长字段,长度信息累计可能导致行数据超出限制。
2.DYNAMIC格式不报错原因
大字段溢出机制:
DYNAMIC格式将大字段(如TEXT/BLOB或超长VARCHAR)的大部分数据存储在溢出页,数据页仅存储前 768 字节和指针,大幅减少数据页内的行长度。- 即使字段总长度很大,数据页内的行数据仍可控制在 16KB 以内,避免触发行长度限制错误。
字段长度存储优化:
- 字段长度信息固定存储在数据页,不随字段实际长度增加而占用更多空间,进一步降低行数据膨胀风险。
总结
| 行格式 | 大字段存储方式 | 行长度限制风险 | 适用场景 |
|---|---|---|---|
| COMPACT | 全部存储在数据页 | 高(易因行过长报错) | 小字段、非大表场景 |
| DYNAMIC | 大字段数据溢出到外部页 | 低(数据页内长度可控) | 含大字段或高并发查询的场景 |
建议:
新建表时优先使用 DYNAMIC(InnoDB 默认),尤其当表包含大字段或预期数据量较大时。
若遇到 COMPACT 格式的行长度报错,可通过以下方式解决:
- 改用
ROW_FORMAT=DYNAMIC。 - 拆分大字段到单独表(垂直分表)。
- 增大数据页大小(需谨慎,修改
innodb_page_size需重启数据库且不可逆)
解决办法:
直接将 ROW_FORMAT = COMPACT 改成 ROW_FORMAT = DYNAMIC;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MySQL删除外键、增加外键以及删除主键、增加主键的实战步骤
在Mysql中使用外键,可以有效地将多个表格的数据"联动"起来,打破独立状态,互相影响,下面这篇文章主要给大家介绍了关于MySQL删除外键、增加外键以及删除主键、增加主键的相关资料,需要的朋友可以参考下2022-08-08
Mysql清空表数据库命令truncate和delete详解
这篇文章主要介绍了Mysql数据库清空表truncate和delete的相关知识,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06
windows 10 下安装mysql 5.7.17的简单笔记
之前一直在Linux下用MySQL,安装也很简单,今天试一下windows下安装,发现有很多坑,今天小编通过本教程给大家记录下,一起看看吧2016-12-12


最新评论