MySQL Innodb Engine -- 文件格式(innodb_file_format)
在InnoDB 1.0.x版本之前,InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录数据,Redundant格式是为兼容之前版本而保留的,而Compact行格式在MySQL 5.0中引入,在 MySQL 5.6 版本中,默认设置为 Compact 行格式。
在compact行格式中:
1.使用5个字节来存放记录头信息(record header);
2.使用null位图来记录列中为null的列;
3.对于变长字段列,如果列长度小于255字节,则需要额外的1个字节来记录长度,如果列长度大于255个字节,使用2字节来记录列长度;
4.对于blob/text/varchar等大字段列,只存放768个字节在数据页中,而剩余的数据存储到溢出端(blob page)中
在compact行格式下,如果记录行包含较多的大字段列,即使每个大字段列只存放768个字节在数据页中,也会导致整个记录行的长度超过8KB,而默认数据页16k,每个数据页至少存放两行记录,因此导致下面错误:
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
除innodb_file_format参数会导出上面错误外,参数max_allowed_packet和innodb_log_file_size设置过小也会触发上面问题:
max_allowed_packet: 服务器发送和接受的最大包长度,当单行数据较大时,需要调整该参数。
innodb_log_file_size: 该参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间。
innodb_log_buffer_size: 该参数确定日志文件所用的内存大小,设置时用M单位进行设置。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1~8M之间的值。
innodb_log_file_size参数在MySQL 5.6/5.7/8.0的默认值为48MB, 当插入记录总长度超过48M时,就会提示Row size too large(无论innodb_file_format)
Compact和redumdant的区别在行记录的首部不同,compact存储格式的首部为一个非NULL的变长字段长度列表,而redundant存储格式的首部是一个字段长度偏移列表。
对于Redundant格式,哪怕只占用769个字节,也会将多余的1个字节存储到额外的page中。
在InnoDB 1.0.X版本中开始引入新的文件格式Barracuda,新文件格式有两种新的行记录格式:Compressed 和 Dynamic。新的两种行记录格式采用完全溢出的方式来存放blob/text数据列,仅在数据页中保留20字节的指针,blob列的数据完全存放在Off page中。
off page将数据完全存储到一个独立的data page中(这些页是独享的,不会与同一行其他列或其他行的列共用),对于平均长度较小的blob/text数据列,会造成严重的磁盘空间浪费和IO资源消耗。
对于Compressed行记录格式,会将行数据以zlib的算法来进行数据压缩,因此可对于BLOB、TEXT、VARCHAR 这类大长度类型的数据能够进行非常有效的存储。
如果表采用Compressed行记录格式,可以有效降低IO开销,但是会增加CPU和内存的开销,在缓冲池中需要保留两份SIZE不同但是数据一致的数据页。
PS: 使用Compressed行记录格式的不仅仅对大长度类型的数据有效,对长度较小的变长列也有效果。但总的说来,压缩效率很一般。
compact行格式相对redumdant更节省存储空间,Compressed行格式相对于compact更节省存储空间,但强烈不建议使用Compressed行格式,会验证影响TPS。
## 查看默认的行格式
show variables like 'innodb_file_format'; ##============================##
## 查看表的行格式
show table status like 'table_name'\G
innodb_page_size参数在MySQL 5.6版本中引入,用来修改每个数据页的默认大小,默认值为16KB。在MySQL 5.6之前版本需要修改源代码才能修改数据页大小。
对于InnoDB存储引擎,数据页的填充率为15/16,预留出1/16的空间用来避免后续数据插入修改而导致页拆分的情况。当数据页的填充率小于1/2时,InnoDB会进行收缩,释放空闲空间。
MySQL Innodb Engine -- 文件格式(innodb_file_format)的更多相关文章
- MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)
MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...
- 14.1.1 InnoDB as the Default MySQL Storage Engine
14.1 Introduction to InnoDB 14.1.1 InnoDB as the Default MySQL Storage Engine 14.1.2 Checking InnoDB ...
- MySQL InnoDB 行记录格式(ROW_FORMAT)
MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...
- mysql innodb 从 ibd 文件恢复表数据
最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...
- MySQL InnoDB存储引擎大观
转的一篇文章作者:七把刀链接:https://www.jianshu.com/p/d4cc0ea9d097 MySQL InnoDB 引擎现在广为使用,它提供了事务,行锁,日志等一系列特性,本文分析下 ...
- Mysql InnoDB 共享表空间和独立表空间
前言:学习mysql的时候总是习惯性的和oracle数据库进行比较.在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较.Oracle的数据存储有表空间.段.区.块.数据文件: ...
- Mysql InnoDB行锁实现方式(转)
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- Mysql InnoDB行锁实现方式
Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点 ...
- mysql innodb 引擎
innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...
随机推荐
- java修饰符用法
public:本类可使用,子类可使用,同一包内的类可使用,不同包内的类可使用 protected:本类可使用,子类可使用(不同包内的子类也可使用),同一包内的类可使用 default(当不写修饰符时) ...
- SQL-6查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
题目描述 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序CREATE TABLE `employees` (`emp_no` int(11) NOT N ...
- L291
If you are currently in the midst of planning a wedding, then I don't need to tell you how stressful ...
- Android:getContext().getSystemService()
一.介绍 getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象 二.语法 Windo ...
- ios遮罩层的简单使用
/** 大图 */ - (IBAction)bigImg { //1.添加按钮遮罩层 UIButton *cover=[[UIButton alloc] init]; cover.frame=self ...
- Arduino+Avr libc制作Badusb原理及示例讲解
一. 前言 2014年美国黑帽大会上研究人员JakobLell和Karsten Nohl展示了badusb的攻击方法后,国内与badusb相关的文章虽然有了一些,但是大部分人把相关文章都阅读后还是会有 ...
- 2019-03-08-day007-深浅拷贝
01 昨日内容回顾 is 两者之间的id是否相同 == 两边的数值是否相等 id 获取该对象的内存地址 代码块: 一个文件,交互式命令行:一行是个一个代码块. 同一代码块下: 字符串的缓存机制,驻留机 ...
- [工作日志] 2018-11-21 主要: 改bug 自测 :校验图片后缀名
正则表达式 用以下方式去校验图片的后缀 String reg = ".+(.JPEG|.jpeg|.JPG|.jpg)$";String imgp= "Redocn_20 ...
- 前端笔记 (3.JavaScript 1)
JavaScript 是属于网络的脚本语言! JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后, ...
- Power BI新主页将使内容的导航和发现变得轻而易举!
微软Power BI 将在近日发布Power BI Home登陆页面的公开预览以及Power BI服务中的新全局搜索功能.登录页将成为所有内容的一站式集合,并提供更快捷的方式来分享你的仪表板.原来在左 ...