MySQL innodb每行数据长度的限制

在使用MySQL InnoDB存储引擎时,遇到创建表时由于行大小超过限制导致的错误。MySQL官方文档指出,每条记录的最大长度有限制,超过8KB的数据会被存储到溢出页中。解决方法包括字段拆分、合并,转换存储引擎至MyISAM,或者调整ROW_FORMAT为COMPRESSED或DYNAMIC。理解这些限制对于优化数据库设计和性能至关重要。

今天在使用MySQL innodb时,create table时,报出这样的一个错误:

Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs
查阅MySQL的官方资料才发现,每条记录有最大长度的。MySQL的官方文档:

链接:https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#row-size-limits

 在MySQL innodb中,所有的数据都是按页(page)来操作的,一页就是16KB(默认的),采用B+树作为索引,B+树中每个节点都是16KB,在最底层的每个叶子节点中存储数据,以主键索引为例,如果每个叶子节点为16KB,那么一行数据超过16KB时,就会出现行溢出,溢出的数据放到另一个page中,即uncompresse blob page

但是在B+树中,每个叶子节点page中至少存储2行数据,否则就失去了意义。那么一行数据的长度就是小于8KB,在一行数据长度超过8KB时,innodb将会将剩余的部分数据写出到另一个溢出页中,该列的前768字节存放在该页中,同时有个偏移指向溢出页。

官方给出的解决方式:

1.垂直表字段拆分或者大字段合并(大字段最多不超过768,业务进行合并+拆分)

2.修改表的存储引擎,modify InnoDB to MyISAM.

3.修改row_format为COMPRESSED或者DYNAMIC,当然前提需保证innodb_file_format =Barracuda.
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值