MySQL InnoDB支持数据压缩,有两种数据压缩方式,第一种为表压缩,通常也称之为行格式压缩,另外一种是页压缩,页压缩对操作系统及文件系统有一定的要求。本文主要介绍表压缩(行格式压缩)的原理及使用方法。

表压缩适用的场景:

有很多字符串类型的字段,比如char, varhcar, text之类。

读多写少的业务场景。

表压缩支持独立表空间和共享表空间,不支持系统表空间。

独立表空间:file-per-table

共享表空间:general tablespace

1. 独立表空间创建压缩表

前提条件:

innodb_file_per_table=ON

innodb_file_format=Barracuda

创建语法:

CREATE TABLE t1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

2. 共享表空间创建压缩表

前提条件:

在general tablespace表空间中创建压缩表,必须要设置FILE_BLOCK_SIZE,它的有效值与innodb_page_size相关,KEY_BLOCK_SIZE 必须为 FILE_BLOCK_SIZE/1024。

例如:

innodb_page_size=16384

FILE_BLOCK_SIZE=8192

KEY_BLOCK_SIZE=FILE_BLOCK_SIZE/1024=8

创建语法:

CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

3. 表压缩语法及原理

3.1 表压缩语法

InnoDB使用如下语法进行压缩表的创建:

ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8

如果没有指定KEY_BLOCK_SIZE值,默认为innodb_page_size值的一半,也就是8KB。

32KB 和 64KB的页大小不支持压缩。默认的InnoDB未压缩的页大小为16KB,KEY_BLOCK_SIZE 可设置为1KB,2KB,4KB,8KB,16KB,KEY_BLOCK_SIZE应当设置为大于表中一条记录的最大长度,实际的压缩算法不受KEY_BLOCK_SIZE值影响,这个值决定每个压缩块有多大,间接影响一个压缩后的页能够存放多少个行记录。如果将KEY_BLOCK_SIZE设置的与页大小一致,比如16K,不会导致太多的压缩,因为正常的一个页面就是16K,但是这样的设置对于blob, text, varchar类型有很好的压缩效果。

3.2 表压缩原理

处理器和内存的计算和存储速度远远大于磁盘IO,因此大多数场景下,数据库性能瓶颈在磁盘IO上,数据压缩能够显著减少数据的大小,减少磁盘IO次数,提高吞吐量,唯一的成本是CPU消耗将会稍微增加。数据压缩对于读密集型的应用有非常好的效果。

创建压缩格式的表,能够使用比innodb_page_size更小的页,更小的页意味着更少的磁盘IO读写。

压缩之后的页大小由参数 KEY_BLOCK_SIZE 指定。如果该值指定的越小,可能会获得越好的IO性能提升,但是如果该值太小,可能会带来其他的额外开销,比如压缩后的数据无法完整容纳在一个非常小的页面里。当然对于KEY_BLOCK_SIZE的值,有一个硬性限制,这个限制基于索引字段的长度,如果KEY_BLOCK_SIZE太小,则会导致create table或者alter table语句执行报错。

对于一个打开压缩功能的表,表中的所有索引,包括聚簇索引、二级索引,都会使用同样的页大小进行压缩。

在buffer pool里面,压缩后的数据存放在更小的页里,页大小由KEY_BLOCK_SIZE指定。如果要更新一个压缩页面里的字段值,需要在buffer pool里面创建一个未压缩的页面来存放解压后的数据,在buffer pool里面,对未压缩页的更新都会重新写回与之相对应的压缩的页。因此打开压缩功能之后,需要增加buffer pool的大小,以容纳额外的数据(压缩和未压缩的页面),当buffer pool里面空闲空间不足时,未压缩的页会被释放,而当下一次访问需要未压缩页面时,它会被再次创建。

4. 表压缩监控

主要通过information_schema里面的几个表来监控压缩状态。

information_schema.INNODB_CMP

information_schema.INNODB_CMPMEM

information_schema.INNODB_CMPMEM_RESET

information_schema.INNODB_CMP_PER_INDEX,默认这个表的监控是关闭的,需要设置参数innodb_cmp_per_index_enabled=ON打开,但对性能有一定影响。

5. 表压缩相关参数

innodb_compression_level,设置压缩级别,取值范围0~9,默认值为6。

innodb_compression_failure_threshold_pct,定义了表压缩失败率阈值,超过这个阈值时,通过增加压缩页中的保留空间,来降低压缩失败率。取值范围0~100,默认值为5。

innodb_compression_pad_pct_max,压缩页中保留的空闲空间的最大比例,取值范围0~75,默认值为50。

innodb_log_compressed_pages,指定重新压缩的页数据是否写入redo log里面,默认值为ON,如果zlib版本不变,建议设置为OFF。

当表压缩导致CPU负载过高,可以考虑降低压缩级别(innodb_compression_level),来减少压缩对CPU的消耗。

6. 表压缩使用限制

MySQL 5.1 之前的版本不支持表压缩。

压缩表不能存放在InnoDB系统表空间。

General tablespaces 表空间可以包含多个表,但是压缩的表和未压缩的表不同共存于一个General tablespaces里面。

表压缩是对整个表的压缩,包括与表相关的所有索引,不能只对指定的行进行压缩。

mysql 压缩表_MySQL InnoDB 表压缩(行格式压缩)相关推荐

  1. mysql表空间不足_MySQL Innodb表空间不足的处理方法 风好大

    官方给出的解决方案: 添加和删除 InnoDB 数据和日志文件 这一节描述在InnoDB表空间耗尽空间之时,或者你想要改变日志文件大小之时,你可以做的一些事情. 最简单的,增加InnoDB表空间大小的 ...

  2. mysql 表死锁_MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下:(1)insert into backup ...

  3. mysql的innodb表生成的物理文件_MySQL innodb表使用表空间物理文件复制或迁移表

    MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种: 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件 直接拷贝innodb的表 ...

  4. mysql表空间权限_MySQL InnoDB表空间加密示例详解

    前言 从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系 ...

  5. mysql 查看表v空间自增涨_MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

  6. mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  7. mysql类型设计_mysql设计表结构数据类型的选择

    选择合适的数据类型 在使用MySQL创建数据表的时候会遇到一个问题,如何为字段选择合适的数据类型.比如创建一个员工信息表,每个字段都可以用很多种类型来定义, int,char,float等等. cha ...

  8. mysql 创建表_MySQL创建表(十一)

    在本教程中,我们将向您展示如何使用MySQL CREATE TABLE语句在数据库中创建新表. MySQL CREATE TABLE语法 要在数据库中创建一个新表,可以使用MySQL CREATE T ...

  9. mysql分析表_MySQL分析表有什么用

    MySQL中使用ANALYZE TABLE语句来分析表,该语句的基本语法如下: ANALYZE TABLE 表名1 [,表名2-] ; 使用ANALYZE TABLE分析表的过程中,数据库系统会对表加 ...

最新文章

  1. 面向对象编程的思想(2)
  2. thinkPHP5.0中使用header跳转没作用
  3. 如何在时间紧迫情况下进行机器学习:构建标记的新闻 数据 库 开发 标记 网站 阅读1629 原文:How we built Tagger News: machine learning on a
  4. poj 3728 Catch That Cow ([kuangbin带你飞]专题一 简单搜索)
  5. 视图加载时自动执行铵钮事件
  6. 计算机二级web题目(7.4)--综合应用题1
  7. VB用API实现各种对话框(总结)(转载)
  8. 前端开发 表单元素 0229
  9. 小程序加入人脸识别_进口香料——强势加入小程序买卖平台出售
  10. CentOS7静态IP地址配置
  11. scala正则表达式 findFirstIn findAllIn findFirstMatchIn findAllMatchIn Match MatchData 提取分组
  12. 华为计算机充电指示灯,数码产品:华为p40充电指示灯不亮在哪里设置 有指示灯吗...
  13. 2018_08_10_生活记录_关于我和这个博客的说明
  14. 一些关于CCNA考试的感受
  15. 计算机保研英语,计算机保研面试英文自我介绍
  16. SAP VK13 提示 内部错误:T IVAKE F IVAKE_INSERT I MV130F0I
  17. Linux下查看硬盘序列号、设备序列号、操作系统版本和安装时间、系统启用时间等命令
  18. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)
  19. 创业失败后的他们,是怎么找工作的?
  20. 【Linux-SVN】安装 SVN Server

热门文章

  1. windows系统切换目录方法
  2. pdo 封装增删改查类
  3. mysql 根据地图 坐标 查询 周边景区、酒店
  4. RabbitMQ操作代码封装
  5. jQuery Todolist
  6. Scala 内部类及外部类
  7. JS 处理十六进制颜色渐变算法-输入颜色,输出渐变rgb数组
  8. UITableViewController
  9. HTML向Flex传参
  10. js plugin--headroom