http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html

压缩理念

通过提高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 数据表压缩原理与限制的更多相关文章

  1. mysql innodb 数据表不存在

    方法一: https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html 修改my.cnf文件 [mysqld] innodb ...

  2. MySQL-02 数据表管理

    学习要点 数据类型 数据字段属性 数据表的类型及存储位置 索引 数据表对象管理 数据类型 数据库中的数据类型分为字段类型和值类型,定义如下: 在设计数据表字段的时候,字段类型定义为三大类:数值类.字符 ...

  3. MySQL架构原理之存储引擎InnoDB数据文件

    MySQL架构原理之体系架构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中简单介绍了MySQL的系统文件层,其中包含了数据文件.那么InnoDB的数据文件是如何分类并存储的呢? 一. ...

  4. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  5. MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)

    常用的Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair 即执行REPAIR TABLE SQL语句 语法:REPAIR TABLE tablename[,table ...

  6. MySQL InnoDB表压缩

    MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...

  7. mysql 数据表的引擎 MyISAM 和 InnoDB

    需要使用锁和事务时,必须使用InnoDB模式 可以通过以下语句查看表的类型 SHOW TABLE STATUS FROM [DATABASE_NAME] 修改数据表的引擎类型: navicat: 设计 ...

  8. Innodb单表数据物理恢复

    本文将介绍使用物理备份恢复Innodb单表数据的方法 前言: 随着innodb的普及,innobackup也成为了主流备份方式.物理备份对于新建slave,全库恢复的需求都能从容应对. 但当面临单表数 ...

  9. MySQL · 引擎特性 · InnoDB 数据页解析

    前言 之前介绍的月报中,详细介绍了InnoDB Buffer Pool的实现细节,Buffer Pool主要就是用来存储数据页的,是数据页在内存中的动态存储方式,而本文介绍一下数据页在磁盘上的静态存储 ...

随机推荐

  1. linux 定时执行shell

    第一步:安装 crontab ,命令 yum -y install vixie-cron                扩展:service crond start //启动服务            ...

  2. 4种检测是否支持HTML5的方法,你知道几个?

    4种检测是否支持HTML5的方法,你知道几个? 1,检查特定的属性是否存在于全局的对象里面,比如说window或navigator. 比如geolocation,它是HTML5新加支持的新特性:它是由 ...

  3. du和df不一致的解决方法

    df:disk free,统计的是当前系统中空闲的磁盘du:disk usage,统计的是正在使用的空闲的磁盘.如果一个文件被删除之后,使用这个文件的进程未重启,则会出现df和du不一致的情况. 解决 ...

  4. Python Tutorial 学习(六)--Modules

    6. Modules 当你退出Python的shell模式然后又重新进入的时候,之前定义的变量,函数等都会没有了. 因此, 推荐的做法是将这些东西写入文件,并在适当的时候调用获取他们. 这就是为人所知 ...

  5. Explain语法

    EXPLAIN SELECT -- 变体: 1. EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得 ...

  6. 转:Ubuntu12.04 LTS 使用心得-开机挂载其他分区

    1.在/media目录下创建好用来关联你要挂载的分区的文件夹(相当于一个虚拟目录/挂载点,链接/映射到你要挂载的盘符去) 我要挂载4个分区,所以创建了四个挂载点,名字随便取,只要你自己认的出来哪个对应 ...

  7. Mysql 授权访问

    ' WITH GRANT OPTION; FLUSH PRIVILEGES; 这就是设置一个 urser:root pwd: 账号,该账号可以在任何机器,同时访问服务器

  8. Transformation

    hdu4578:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:给一个序列 {an},有 4 种操作.1.将一段区间的数全部加 c.2.将一段区间的 ...

  9. TWinControl的DoubleBuffered属性的作用与举例

    留个爪,网上搜一篇,仔细分析一下.

  10. 「Poetize7」电话线路

    描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通 ...