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