InnoDB 数据表压缩原理与限制
压缩理念
通过提高CPU利用率和节约成本,降低数据库容量及I/O负载,从而使数据吞吐率得到显著提高。
压缩原理
压缩表减少了磁盘上数据库的大小,使得用户不必频繁地操作写入和读取便可以访问数据。对于 InnoDB的工作量以及传统的用户表而言(特别是在某些读取密集型的应用中,内存有足够的空间存储常用数据),数据压缩不仅大大减少了数据库所需的存储空间,而且还减少了 I/O的工作量,提高了数据吞吐率,从而节约开销处理成本。节省存储成本固然重要,但是减少 I/O成本更为关键。
在InnoDB中,是以16K的页(Page)为基本的存储单位的。我们知道,InnoDB是的数据是在Clustered index中存储的,在Secondary index中仅存储对应数据的PK。Clustered index和Secondary index都是B-Tree结构的,所以对InnoDB数据页和索引页的压缩很大程度上就是对B-Tree节点页的压缩。
在InnoDB中,除了B-Tree节点页,还有一类数据页(Page),称为“overflow page”。当需要存储Long column时,如果当前页能够完全存储全部字段时,则存储在当前页中;如果当前页不足以存储全部,则InnoDB选择最长的字段,将其存储到一个单独的页中,我们称这样的页为“overflow page”,而原数据页仅仅需存储一个20Bytes的指针。参考下图:

压缩使用的是zlib library中的LZ77算法。
压缩限制
为了保持数据库文件的向下兼容性,只有在使用innodb_file_format配置参数来启动“Barracuda”数据库文件格式时,压缩才能被指定。在 InnoDB系统表空间压缩表也是不可行的。系统表空间(space 0, the ibdata* 文件)不仅包含用户数据,还包含InnoDB内部系统信息,永远不能被压缩。因此,压缩只适用于存储在表空间的表(以及索引)。
什么时候使用压缩
通常情况下,对于字符串数量适中的表来说,读取数据比写入数据速度更快,压缩性能最佳。压缩时应努力减少数据文件的大小,影响其压缩效率的决定性因素就是数据本身。在一组数据中识别重复的字符串可以撤消压缩。完全随机的数据是最糟糕的。传统的数据往往有重复的值,压缩起来也相对有效。字符串也往往很容易压缩,不管它是定义在CHAR, VARCHAR, TEXT上还是BLOB列上。另一方面,某些表包含了大部分的二进制数据(整数或浮点数)或者之前被压缩的数据(例如JPEG或PNG图像),压缩起来通常比较困难。
除了考虑选择哪些表进行压缩(以及页面大小如何设置),工作量是衡量性能的另一个关键因素。InnoDB为压缩的数据设置了修改日志,如果应用程序以读取为主而不是以更新为主,那么,在索引页占用完每一页“修改日志”的空间之后,只有少数的页面需要进行重组和重新压缩。如果更新主要改变的是非索引列或者一些包含了碰巧被存储为“off-page”的BLOBs及大的字符串的列,压缩的开销是可以接受的。如果表中唯一更改的是使用单递增主键的INSERTs语句,并且不存过太多非聚集索引,那么,便没必要重组或重新压缩索引页。由于InnoDB能够在压缩页面“标记删除”以及删除记录,并以此来“替代”修改未压缩的数据,因此,在表中进行DELETE操作是相对有效的。
对于某些环境,加载数据所耗费的时间与运行检索所需的时间同样意义重大。特别是在数据仓库环境下,很多表的属性为只读或者以读取为主。在这种情况下,除非在更少的磁盘读取中或存储成本上造成的节约效果是显著的,否则,从增加的加载时间角度出发,压缩付出的代价实在不能令人接受。
从根本上说,当CPU时间可用于压缩及解压数据时,压缩效果最佳。因此,如果工作量是由I/O引起的,而不是由CPU引起,压缩便能够提高整体性能。所以,在使用不同的压缩配置测试应用程序时,你应该在一个类似于产品系统计划配置的平台上进行测试。
压缩过程
当使用压缩存储的页面,当Buffer Pool载入后,会将其解压。这时,该页面在Buffer Pool中同时存在“压缩版”和“解压版”。当Buffer Pool需要驱逐这些页的时候,有两种情况会发生:如果InnoDB认为当前应用是IO-Bound,相比CPU还有额外能力来做解压操作,则InnoDB选择仅驱逐页面的“解压版”;否则InnoDB会将页面的两个版本同时驱逐出去。也就是说Buffer Pool会是下图的状态:

InnoDB 数据表压缩原理与限制的更多相关文章
- mysql innodb 数据表不存在
方法一: https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html 修改my.cnf文件 [mysqld] innodb ...
- MySQL-02 数据表管理
学习要点 数据类型 数据字段属性 数据表的类型及存储位置 索引 数据表对象管理 数据类型 数据库中的数据类型分为字段类型和值类型,定义如下: 在设计数据表字段的时候,字段类型定义为三大类:数值类.字符 ...
- MySQL架构原理之存储引擎InnoDB数据文件
MySQL架构原理之体系架构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中简单介绍了MySQL的系统文件层,其中包含了数据文件.那么InnoDB的数据文件是如何分类并存储的呢? 一. ...
- 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
- MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)
常用的Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair 即执行REPAIR TABLE SQL语句 语法:REPAIR TABLE tablename[,table ...
- MySQL InnoDB表压缩
MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...
- mysql 数据表的引擎 MyISAM 和 InnoDB
需要使用锁和事务时,必须使用InnoDB模式 可以通过以下语句查看表的类型 SHOW TABLE STATUS FROM [DATABASE_NAME] 修改数据表的引擎类型: navicat: 设计 ...
- Innodb单表数据物理恢复
本文将介绍使用物理备份恢复Innodb单表数据的方法 前言: 随着innodb的普及,innobackup也成为了主流备份方式.物理备份对于新建slave,全库恢复的需求都能从容应对. 但当面临单表数 ...
- MySQL · 引擎特性 · InnoDB 数据页解析
前言 之前介绍的月报中,详细介绍了InnoDB Buffer Pool的实现细节,Buffer Pool主要就是用来存储数据页的,是数据页在内存中的动态存储方式,而本文介绍一下数据页在磁盘上的静态存储 ...
随机推荐
- Java学习----一个对象怎么调用另一个对象呢?
打包 jar cvfm test1.jar manifmest.mf teacher.class student.class test1.class 运行 java -jar test1.jar pu ...
- this详解:JAVASCRIPT中的this到底是谁?
语法 this 全局对象 在全局执行上下文(函数之外),this引用的是全局对象. console.log(this.document === document); // true // In web ...
- 最优秀的5个Linux文本编辑器
from: http://article.yeeyan.org/view/169956/174836 作为不久前举办的比赛的一部分内容,我从那些选出他们最喜欢的Linux文本编辑器的极客读者们那获得了 ...
- 【python常用模块】os.path
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...
- SQLSERVER 2008 R2版本密钥(摘)
开发版32位:MC46H-JQR3C-2JRHY-XYRKY-QWPVM开发版64位:FTMGC-B2J97-PJ4QG-V84YB-MTXX8 工组版:XQ4CB-VK9P3-4WYYH-4HQX3 ...
- 最简单理解CGI,FastCGI,WSGI
CGI规定了如何执行本地脚本技术规范(协议),FastCGI规定了如何远程请求执行脚本的技术规范,WSGI规定了如何请求执行Python脚本的规范. 他们的相同点就是envionment variab ...
- Adobe Acrobat XI Pro 两种破解方式 Keygen秘钥 license替换 亲测有效
大家平时看paper比较多的话想必都是用Adobe Acrobat而非Adobe Reader吧,其功能全面之处就不啰嗦了,下面给大家分享下Adobe Acrobat XI Pro的两种破解方式(两种 ...
- hibernate 多对一的情况
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC ...
- WEB工程数据库相关安装脚本写作
1. 数据库oracle安装 2. 数据库用户创建,表空间创建,表创建 #!/bin/bash current_path=`pwd` create_tablespace=${current_path} ...
- 【Linux】鸟哥的Linux私房菜基础学习篇整理(二)
1. dumpe2fs [-bh] devicename:查询superblock信息.参数:-b:列出保留为坏道的部分:-h:列出superblock的数据,不会列出其他的区段内容. 2. df [ ...