物理学可建设网站建设说明,镇江个人网站制作,做的网站打开慢,千图网免费海报素材图库提示#xff1a;啰嗦一嘴 #xff0c;数据库的任何操作和验证前#xff0c;一定要记得先备份#xff01;#xff01;#xff01;不会有错#xff1b; 文章目录 问题发现一、问题导致的可能原因1、页大小2、行格式2.1 compact格式2.2 Redundant格式2.3 Dynamic格式2.4 Co… 提示啰嗦一嘴 数据库的任何操作和验证前一定要记得先备份不会有错 文章目录 问题发现一、问题导致的可能原因1、页大小2、行格式2.1 compact格式2.2 Redundant格式2.3 Dynamic格式2.4 Compressed格式 3、BLOB和TEXT列 二、解决办法1、修改页大小不推荐2、修改行格式3、修改数据类型为BLOB和TEXT列4、其他优化方式可以参考使用4.1 合理设置数据类型大小4.2 合理进行表结构设计4.3 更换存储引擎 问题发现
今天在导入他人项目中的sql数据库文件时出现一个mysql的错误提示大致描述是 Row size too large ( 8126)英文不算好的我看字面意思估摸着大概就是说我们插入的行数据可能太大了超过了设定的阙值
一、问题导致的可能原因
这个限制主要是因为MySQL内部存储机制的约束MySQL的InnoDB存储引擎有一个最大行大小限制关于mysql引擎内容比较多以后再专门写一篇内容好好说说这里我们只需要知道他是目前mysql 默认的存储引擎就好啦
而这个最大行大小限制主要由于几个因素影响
1、页大小
页是InnoDB管理数据的最小单位InnoDB使用16KB的页来存储数据行数据在进行保存插入的时候要求我们的单行数据不能跨越多于半个页8KB。否则数据库会自动按照是否进行溢出页的机制来处理数据 简单说的话其实就是数据库中的每行数据我们可以看作是一所个人专属的小房子里面预留了一个固定的空间给他们放东西如果放入的东西太多了超过这个空间大小屋主就会考虑是否可以把东西放在屋外来保障空间不至于太过拥挤这里的房间内的空间就是页内空间大小房外就是多出的
2、行格式
InnoDB支持几种行格式如compact、redundant、dynamic和compressed。其中dynamic和compressed格式是为了解决行大小限制而引入的允许行中的某些列如BLOB和TEXT类型存储在页外。 这点简单的来说四种行格式可以看作是房屋管理办法四个准则每个准则都有各自适用的场景和优点
关于行格式我们这里只需要知道有哪几种以及他们数据存储方式各自应用场景即可
2.1 compact格式
InnoDB的默认行格式也是最常用常见的格式采取的是位图压缩的存储方式适用于大多数OLTP在线事务处理应用场景。OLTP其实就是指那种较高并发并且要求低延迟专注业务操作的应用类似银行交易、订单处理、库存更新那些情况比较常用
2.2 Redundant格式
MySQL 5.0以前的默认行格式适用具有大量NULL值的表
2.3 Dynamic格式
从 MySQL 5.6.3 开始默认的行格式是 DYNAMICDynamic行格式具有高度的灵活性可以动态地调整行的大小和存储方式。基于实际数据长度大小来进行调整存储空间以节省存储空间适用于包含大量长度可变列的表例如包含TEXT、BLOB等大型字段的表。
2.4 Compressed格式
Compressed行格式采用压缩存储方式它适用于存储大量重复数据或较大的表。Compressed行格式使用多种压缩算法如Zlib和LZO等能够显著减少磁盘I/O操作提高存储和读取性能
3、BLOB和TEXT列
这点因素与上面那点有关Blob 和 Text 是mysql中的大数据存储类型但是在我们不设置行模式为ynamic和compressed的时候这些列通常存储在页外但它们的元数据如长度仍然存储在行内而这个存储的大小跟行格式的设置会有所不同。也就是说明他会计入行大小限制的计算
二、解决办法 好了既然知道问题原因的可能了现在就是开始如何解决了 1、修改页大小不推荐
虽然mysql InnoDB的引擎默认的页大小是16KB但是这个值并不是不能修改修改配置文件 添加或修改innodb_page_size参数来设置新的页大小。例如innodb_page_size 16384以字节为单位对应16KB或者设置的更大 不过需要注意的是页大小的调整最好是在数据库初始化的初期去设置一旦数据库初始化完成后就不建议更改了这种情况下意味着你原来已经存在的所有ibdata和ib_logfile文件都需要重建那就不是很合适了而且这样做也可能会带来一定的性能影响
2、修改行格式
既然dynamic和compressed行格式就是为了解决行大小限制而引入的我们可以修改该格式即可当然了我们也不是都要去修改这个这个也是和我们的mysql版本有关的
从 MySQL 5.6.3 开始默认的行格式是 DYNAMIC也就是说其实在这个版本之后的我们其实就不需要修改行格式了 不过如果你和博主一样是通过导入sql文件的方式创建的表的话需要确认你的sql文件中是否有另外定义行格式例如 博主虽然数据库是8.0默认行模式已经是DYNAMIC但是对方给的sql文件创建表的语句中指定了Compact行格式这个原因大概率是因为它在导出时候环境是基于mysql5.x而博主是8.0的所以这里导出的时候会有所出入这里我讲所有的行模式设置都去掉了默认就会按照DYNAMIC设置就不会报错了因此我们在做不同版本mysql的数据导入与导出时需要特别小心版本不同带来的影响
3、修改数据类型为BLOB和TEXT列
如果你本来该字段就会需要存储较大的数据就应该用blob和text来替换原来的数据类型VARCHAR或CHAR这样能让数据大部分存储在溢出页中而不去纳入大小限制的值计算而如果我们之前设置了行模式的话这个纳入计算的值占用会更小
4、其他优化方式可以参考使用
4.1 合理设置数据类型大小
在进行表设计时候一些列字段我们根据实际需要设计例如varchar数据类型如果实际存储值不大长度就定义足够空间大小即可即能用varchar64就不用varchar128能用128就不要用256尽可能合理分配空间
4.2 合理进行表结构设计
如果设计表的时候单表列尽量不要太多适当的进行拆表将列分出去也能在一定横渡上避免问题
4.3 更换存储引擎
换另一种存储引擎这个方法的话见仁见智要根据自己的业务场景来抉择了比如MyISAM引擎最大的缺点就是它不支持事务和高并发所以才使得大多数情况下我们仍然在用InnoDB引擎的原因虽然它读写性能上并没有前者优秀