Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL单行数据最大存储

MySQL数据库单行数据最大可以存储多少详解

作者:快点好好学习吧

MySQL中一行数据的最大大小是65535字节(即64KB),但这包括了行的所有字段以及一些管理开销,因此实际可用的存储空间通常会少于这个理论值,这篇文章主要介绍了MySQL数据库单行数据最大可以存储多少的相关资料,需要的朋友可以参考下

MySQL 单行数据的最大存储限制,并非一个固定值,而是由 存储引擎、页大小、行格式、列类型 共同决定的动态上限。

一、InnoDB 行大小硬限制

1.官方文档定义

关键公式
有效行大小 ≤ 16,384 - 页开销(~200B) - 系统列(13B) - 预留空间(~7,000B)

2.为什么不是 16KB?

⚠️ 实测上限
单行总数据(不含溢出)≤ 7,950 字节(MySQL 8.0)

二、突破限制:溢出页(Off-page Storage)

当行数据超过阈值,InnoDB 自动将 大字段 存入 溢出页(Overflow Pages)

列类型溢出阈值存储方式
TEXT/BLOB> 768 字节主键页存 20 字节指针,数据存独立页
VARCHAR> 768 字节同 TEXT
JSON总大小 > 768 字节同 TEXT

效果
逻辑行大小无硬上限(受限于 innodb_page_size 和磁盘空间)

示例:

CREATE TABLE t (
    id INT PRIMARY KEY,
    content LONGTEXT  -- 可存 4GB 数据
);

三、各列类型的存储上限

类型最大值磁盘占用
TINYINT1 字节1B
INT4 字节4B
BIGINT8 字节8B
VARCHAR(N)65,535 字节实际长度 + 1~2B 长度前缀
TEXT65,535 字节同 VARCHAR
MEDIUMTEXT16MB指针 + 溢出页
LONGTEXT4GB指针 + 溢出页
JSON≈ 1GB以 TEXT 形式存储

⚠️ 注意
所有列总和 ≤ 65,535 字节(MySQL 行格式限制,非 InnoDB)

四、行格式(ROW_FORMAT)的影响

格式溢出策略适用场景
COMPACT> 768 字节溢出旧版本兼容
DYNAMIC所有大字段直接溢出推荐!减少主键页碎片
REDUNDANT已废弃

最佳实践

CREATE TABLE t (...) ROW_FORMAT=DYNAMIC;

五、极端情况测试

1.最大单行(无溢出)

-- 创建接近 8KB 的行
CREATE TABLE max_row (
    c1 VARCHAR(7000),
    c2 VARCHAR(900)
) ROW_FORMAT=DYNAMIC;

2.最大单行(含溢出)

-- 存储 1GB JSON
CREATE TABLE huge_json (
    id INT PRIMARY KEY,
    data JSON
) ROW_FORMAT=DYNAMIC;

INSERT INTO huge_json VALUES (1, LOAD_FILE('/path/to/1gb.json'));

六、生产建议

  1. 避免宽表

    • 单行 > 4KB 会降低 Buffer Pool 效率
    • 将大字段拆到单独表
  2. 强制 DYNAMIC 格式

    SET GLOBAL innodb_file_format=Barracuda;
    SET GLOBAL innodb_file_per_table=ON;
    CREATE TABLE t (...) ROW_FORMAT=DYNAMIC;
    
  3. 监控溢出页

    -- 查看溢出页使用
    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 
    WHERE NAME='your_db/your_table';
    

总结

到此这篇关于MySQL数据库单行数据最大可以存储多少的文章就介绍到这了,更多相关MySQL单行数据最大存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文