MySQL row_format引发的案例一则
背景知识:
InnoDB存储引擎和大多数数据库一样,记录是以行的形式存储的,这意味着页中保存着表中一行行的数据。另外MYSQL对每个页存放的记录数又有硬性的规定,最少2行,最多16KB/2 - 200,即7992行。
在InnoDB 1.0.X之前,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据。Redundant是mysql5.0版本之前的行记录存储方式,之后仍然支持这个格式是为了兼容之前版本的格式,5.1之后很少用到了,因为Compact的结构设计比它好得多,compact格式消耗的磁盘空间和备份耗时更小,Redundant相比之下大了一些。compact格式更适用于大多数的业务场景。
在InnoDB 1.0.X版本开始又引入了新的文件格式(file format),
以前支持Compact和Redundant格式称为Antelope文件格式,
新引入的文件格式称为Barracuda文件格式。
Barracuda文件格式下拥有两种新的行记录格式:Compressed和Dynamic,
同时,Barracuda文件格式也包括了Antelope所有的文件格式。
这样Barracuda文件格式支持4种row_format:
Redundant、Compact、Compressed、Dynamic
而Antelope文件格式只支持2种row_format:
Redundant、Compact
参数innodb_file_format用来指定文件格式,可以通过下面的方式来查看当前所使用的InnoDB存储引擎的文件格式:
show variables like 'innodb_file_format';
现在基本上都是Barracuda。
Dynamic和Compact基本是类似的,但是它们在行溢出数据的处理上却完全不同:
compact格式下,溢出列存储前768字节,而dynamic格式下,溢出的列只存储前20字节,一旦发生了行溢出,
dynamic其实就存储一个指针,数据都放在溢出页里,dynamic代表将长字段(发生行溢出)完全off-page存储。
Row_format 引发异常的一个案例:
前几天生产MYSQL遇到的一个问题,在录入数据时,整行数据完全录不进去,报以下错:
Cause:java.sql.SQLException: com.taobao.tddl.common.exception.TddlException:java.sql.SQLException:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Row size too large (> 8126). Changing
some columns to TEXT or BLOB or usingROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
may help. In current row format,BLOB prefix of 768 bytes is stored inline.; nested exception
iscom.ibatis.common.jdbc.exception.NestedSQLException:
该表是一个产品介绍详情表,有20多个TEXT 字段,刚好碰到了一个产品,每个字段录入的数据都很长,
而mysql 中有了个限制,一个页(这里pagesize 是16K)必须至少存2行,也就是说每行的存储长度必须小于等于8192,而这么多 TEXT 字段,一行肯定是存不下来,也就是会发生溢出,而即例发生溢出,每个列仍然会存储前768字节(该表的row_formart 是compact),字段一多还是超过了8192,于是就报错,插不进了。
最后将表的row_format 改为 dynamic 得以解决。alter table … row_format=dynamic;
所以,如果大家遇到一些表TEXT 或 VARCHAR 大字段很多,又不好拆解时,可能需要考虑下溢出后列的长度了,如果溢出后列的长度还是太大,则要看一下表的 row_format :
show table status like '%xxx%'\G
必要时需要将其实设置为 dynamic 如:
create table test(id int,name text,...... ) row_format=dynamic;
或
alter table test row_format=dynamic;
转载于:https://blog.51cto.com/13476134/2122557
MySQL row_format引发的案例一则相关推荐
- Mysql之索引优化案例
Mysql之索引优化案例 1.单表简单案例 1.1创建表 1.2 问题: 1.3 解决:新建索引 1.4 再次执行 2.双表简单案例 2.1创建表并插入数据 2.2 由于是LEFT JOIN,所以左表 ...
- Vue+MySQL实现登录注册案例
Vue+MySQL实现登录注册案例 1.新建vue项目并连接数据库 具体步骤见vue连接mysql数据库 2.新建登录页面.注册页面和首页 在src/views文件夹下,新建 login.vue(登录 ...
- MySQL建员工表案例
MySQL建员工表案例 create table DEPT( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); alter t ...
- Vue+SpringBoot+Mybatis+Mysql前后端分离案例
Vue+SpringBoot+Mybatis+Mysql前后端分离案例(二) 前端开发 main.js代码如下 import Vue from 'vue' import App from './App ...
- mysql slave lock 跳过_slave开启MTS时执行mysqldump引发死锁案例
出现这种问题除非手动干预,杀掉FTWRL的session,复制线程方可以继续进行.版本社区版5.7.26. 二.堵塞图 如果分析上面的堵塞可以画图如下: 三.关于woker线程w1和w3的等待 这里我 ...
- 慎重选型:PG还是MySQL?Uber的案例不能作为参考!
本文原作者:Markus Winand,原文链接:www.yumpu.com/en/document/view/53683323/migrating-uber-from-mysql-to-postgr ...
- Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock
Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...
- Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...
- Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...
最新文章
- oracle最大实例数,【Oracle】RAC的多实例数据迁移至单机的多实例。
- 做了一个系列的Android开发教程列表
- 学习动态性能表(10)--v$session_longops
- nrf52832的p09,p10 配置为 普通的gpio口
- python 禁用网卡_如何编程实现启用禁用网卡
- Apache Cordova介绍
- mysql 排序取前4,mysql分组取每组前几条记录(排序)
- 测试监控系列:使用vb批量统计nmon结果
- 楼市信贷新政力度超市场预期 房企放风要涨价
- 想成为高薪的Java架构师该如何做?
- Tiny服务的开发配套的工具来了
- 《软件测试的艺术》读后感及笔记集合
- 计算机二级c选择题题库,全国计算机二级C选择题题库套
- N卡驱动版本与NVCUDA驱动版本和CUDA toolkit的关系
- 智慧城市数字政府建设【转】
- 云盘行业的“冰与火”
- Sniffer软件简介
- java---集合类---ArrayList类
- vscode 代码片段如何输出$符号
- 计算机系统基础实验——数据的机器级表示
热门文章
- Vue2.x-02根据条件动态设置下拉框、时间选择器、文本框是否可编辑
- CuteBot智能小车
- 机器学习:论相关(一)
- 语音识别1: 音频信号采集、并存入 wav文件
- 2021-05-21 深入理解SLAM技术 【4】射影几何--2面中心射影
- 计算机专业英语教程2.1.1,计算机专业英语教程目录
- linux进程服务,Linux服务及进程
- update 和 left join 合并_Python数据预处理——连接、合并、重塑样本
- Matlab的不同进制转换
- 2021-01-27 CentOS系统将UTC时间修改为CST时间方法