MySQL行格式COMPACT和DYNAMIC到底有什么区别

 更新时间:2026年11月04日 15:05:02   作者:dingcho  
还在纠结MySQL表行格式怎么选吗?本文详细对比COMPACT和DYNAMIC的区别,告诉你为什么遇到大字段时COMPACT会报Rowsizetoolarge错误,而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 格式的行长度报错,可通过以下方式解决:

  1. 改用 ROW_FORMAT=DYNAMIC。
  2. 拆分大字段到单独表(垂直分表)。
  3. 增大数据页大小(需谨慎,修改 innodb_page_size 需重启数据库且不可逆)

解决办法:

直接将  ROW_FORMAT = COMPACT  改成   ROW_FORMAT = DYNAMIC;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL常用SQL语句总结包含复杂SQL查询

    MySQL常用SQL语句总结包含复杂SQL查询

    今天小编就为大家分享一篇关于MySQL常用SQL语句总结包含复杂SQL查询,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 详解MySQL中DISTINCT去重的核心注意事项

    详解MySQL中DISTINCT去重的核心注意事项

    为了实现查询不重复的数据,MySQL 提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户,下面小编就来和大家简单讲讲DISTINCT去重的核心注意事项吧
    2025-06-06
  • MySQL删除外键、增加外键以及删除主键、增加主键的实战步骤

    MySQL删除外键、增加外键以及删除主键、增加主键的实战步骤

    在Mysql中使用外键,可以有效地将多个表格的数据"联动"起来,打破独立状态,互相影响,下面这篇文章主要给大家介绍了关于MySQL删除外键、增加外键以及删除主键、增加主键的相关资料,需要的朋友可以参考下
    2022-08-08
  • Mysql清空表数据库命令truncate和delete详解

    Mysql清空表数据库命令truncate和delete详解

    这篇文章主要介绍了Mysql数据库清空表truncate和delete的相关知识,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • mysql innodb的监控(系统层,数据库层)

    mysql innodb的监控(系统层,数据库层)

    这篇文章主要介绍了mysql innodb的监控(系统层,数据库层)的相关资料,需要的朋友可以参考下
    2017-04-04
  • windows 10 下安装mysql 5.7.17的简单笔记

    windows 10 下安装mysql 5.7.17的简单笔记

    之前一直在Linux下用MySQL,安装也很简单,今天试一下windows下安装,发现有很多坑,今天小编通过本教程给大家记录下,一起看看吧
    2016-12-12
  • MySQL中OFFSET 越大越慢怎么解决

    MySQL中OFFSET 越大越慢怎么解决

    本文主要介绍了深分页问题优化策略,探讨LIMIT OFFSET分页性能瓶颈,提出延迟关联、游标分页及子查询优化三种方案,帮助解决大OFFSET值下性能下降问题
    2026-06-06
  • 优化mysql之key_buffer_size设置

    优化mysql之key_buffer_size设置

    这篇文章主要介绍了优化mysql之key_buffer_size设置的相关资料,需要的朋友可以参考下
    2016-05-05
  • mysql怎么注册成windows服务详细步骤教程

    mysql怎么注册成windows服务详细步骤教程

    还在为mysql注册成服务发愁?本文手把手教你解压安装mysql,配置my.ini文件,用命令注册服务并启动,遇到dll缺失或忘记初始密码?也提供跳过密码登录的修复方法,帮你顺利搞定mysql服务注册
    2026-09-09
  • MySQL批量去掉某个字段中的空格

    MySQL批量去掉某个字段中的空格

    这篇文章主要介绍了MySQL批量去掉某个字段中的空格的简单方法,具有一定参考价值,给大家分享下,一起参考,交流。
    2017-10-10

最新评论