MySQL innodb每行数据长度的限制

今天在使用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.
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值