【MySQL精通之路】InnoDB(9)-表和页压缩(2)-页压缩

目录

1.支持的平台

2.页面压缩的工作原理

3.启用页面压缩

4.禁用页面压缩

5.页面压缩-元数据

6.使用页面压缩识别表

7.页面压缩限制和使用说明


InnoDB支持对驻留在FPT表空间中的表进行页面级压缩

此功能被称为透明页面压缩。通过使用CREATE TABLE或ALTER TABLE指定COMPRESSION 属性来启用页面压缩 。支持的压缩算法包括ZlibLZ4


1.支持的平台

页面压缩需要稀疏文件打孔支持 。使用NTFSWindows 以及以下MySQL支持的Linux平台子集支持页面压缩,其中内核级别提供打孔支持

RHEL 7和使用内核版本3.10.0-123或更高版本的派生发行版

OEL 5.10(UEK2)内核版本2.6.39或更高版本

OEL 6.5(UEK3)内核版本3.8.13或更高版本

OEL 7.0内核版本3.8.13或更高版本

SLE11内核版本3.0-x

SLE12内核版本3.12-x

OES11内核3.0-x版本

Ubuntu 14.0.4 LTS内核3.13或更高版本

Ubuntu 12.0.4 LTS内核3.2版或更高版本

Debian 7内核3.2或更高版本
注意:

某些Linux发行版的所有可用文件系统可能都不支持打孔。
博主补充:

你可以这么理解什么是稀疏文件和打孔,稀疏文件就是有一个程序在写文件时,先申请了一个1GB的空间,但是它只在这1GB的空间的最后的地方写入了几个字节的数据,但是表观看起来这个文件就是有1个GB。就好像我们下载电影,电影还没下完,但是磁盘上已经是显示这个电影的总大小了。这种并没有实际写入实际大小数据的文件你可以称之为稀疏文件。

而打孔技术,就是对这样的文件进行整理,将未写的空间整理出来使用。

如果你是Java开发的话,你可以理解为JVM中垃圾收集时对内存进行的标记整理压缩算法。或者Windows中的磁盘碎片整理。

2.页面压缩的工作原理

写入页面时,会使用指定的压缩算法 对其进行压缩 。压缩后的数据被写入磁盘,打孔机制页面末尾 释放空块。如果压缩失败,数据将按原样写入

Windows NTFS分区大小和压缩单元

分区大小 压缩单元
512 Bytes 8 KB
1 KB 16 KB
2 KB 32 KB
4 KB 64 KB

只有当页面数据 可以压缩到小于或等于InnoDB页面大小减去压缩单元大小的大小时,Windows系统上的页面压缩才有效。

默认的NTFS分区大小为4KB ,其压缩单元大小为64KB 。这意味着页面压缩对于开箱即用的Windows NTFS配置没有任何好处,因为innodb_page_size的最大值也是64KB

要在Windows上进行页面压缩,必须创建分区大小小于4K的文件系统,innodb_page_size必须至少是压缩单元大小的两倍。

例如,为了在Windows上进行页面压缩,可以构建分区大小为512字节(压缩单位为8KB) 的文件系统,并使用InnoDB_page_size值16K 或更大的值初始化InnoDB

3.启用页面压缩

要启用页面压缩,请在CREATE TABLE语句中指定COMPRESSION 属性。例如

sql 复制代码
CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";

您还可以在ALTER TABLE语句中启用页面压缩。但是,ALTER TABLE ... COMPRESSION仅更新表空间压缩属性。

设置新的压缩算法 后发生的对表空间的写入使用新设置 ,但要将新压缩算法应用于现有页面 ,必须使用OPTIMIZE TABLE重新生成表。

sql 复制代码
ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;

4.禁用页面压缩

若要禁用页面压缩,请使用ALTER TABLE将COMPRESSION 设置为None。

在设置COMPRESSION=None之后发生的对表空间的写入不再使用页面压缩。

若要解压缩现有页面,必须在设置COMPRESSION=None后使用OPTIMIZE TABLE重新生成表。

sql 复制代码
ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;

5.页面压缩-元数据

页面压缩元数据位于Information Schema库INNODB_TABLESPACES表的以下列中:

FS_BLOCK_SIZE:文件系统块大小,是用于打孔的单位大小。

FILE_SIZE:文件的外观大小,表示未压缩文件的最大大小。

ALLOCATED_SIZE:文件的实际大小,即磁盘上分配的空间量。
注意:

在类Unix系统上

ls-l tablespace_name.ibd字节为单位 显示明显的文件大小(相当于file_size)。

要查看磁盘上分配的实际空间量(相当于ALLOCATED_SIZE):

请使用du--block SIZE=1 tablespace_name.ibd

--block size=1选项字节 而不是 的形式打印分配的空间 ,以便将其与ls-l输出进行比较。

使用SHOW CREATE TABLE 查看当前页面压缩设置(Zlib、Lz4或None)。

一个表可能包含具有不同压缩设置页面的混合

在以下示例中,从Information Schema库INNODB_TABLESPACES表中检索employees表的页面压缩的元数据。

sql 复制代码
# Create the employees table with Zlib page compression

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
) COMPRESSION="zlib";

# Insert data (not shown)

# Query page compression metadata in INFORMATION_SCHEMA.INNODB_TABLESPACES

mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
       INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040

employees表的页面压缩元数据显示,表观文件大小为23068672字节 ,而实际文件大小(使用页面压缩)为19415040字节。文件系统块大小为4096字节,这是用于打孔的块大小。

6.使用页面压缩识别表

要识别启用了页面压缩的表,可以检查Information Schema库的tables表的CREATE_OPTIONS列中是否有使用COMPRESSION 属性定义的表:

sql 复制代码
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES 
       WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%';
+------------+--------------+--------------------+
| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS     |
+------------+--------------+--------------------+
| employees  | test         | COMPRESSION="zlib" |
+------------+--------------+--------------------+

SHOW CREATE TABLE还显示COMPRESSION属性(如果使用的话)。

7.页面压缩限制和使用说明

如果文件系统块大小(或Windows上的压缩单元大小)*2 > innodb_Page_size,则禁用页面压缩。
对于驻留在共享表空间(包括系统表空间、临时表空间和通用表空间)中的表,不支持页面压缩。
redolog表空间不支持页面压缩。
undolog日志页不支持页面压缩。
用于空间索引的R树页不会被压缩。
属于压缩表(ROW_FORMAT=COMPRESSED)的页面保持原样。
在恢复过程中,更新的页面会以未压缩的形式写出。
不支持所使用的压缩算法 的服务器上加载页面压缩表空间会导致I/O错误
在降级到不支持页面压缩的MySQL早期版本之前,请解压缩使用页面压缩功能的表。若要解压缩表,请运行ALTER TABLE ... COMPRESSION=None 且 OPTIMIZE TABLE.重建表
如果使用的压缩算法在Linux和Windows服务器上都可用,则可以在这两台服务器之间复制页压缩的表空间。
当将页压缩的表空间文件 从一个主机移动到另一个主机时,保留页压缩需要一个保留稀疏文件的实用程序
与其他平台相比,使用NVMFSFusion io 硬件可以实现更好的页面压缩,因为NVMFS旨在利用打孔功能。
使用具有较大InnoDB页面大小相对较小文件系统块大小 的页面压缩功能可能会导致写入放大 。例如,具有4KB文件系统块大小64KB的最大InnoDB页面大小 可以提高压缩,但也可能增加对缓冲池的需求 ,从而增加I/O潜在的写入放大


上一篇:

【MySQL精通之路】InnoDB(9)-表和页压缩(1)-表压缩-CSDN博客

相关推荐
问道飞鱼2 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
HaiFan.2 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
水根LP492 小时前
linux系统上SQLPLUS的重“大”发现
数据库·oracle
途途途途3 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
04Koi.3 小时前
Redis--常用数据结构和编码方式
数据库·redis·缓存
silver98863 小时前
mongodb和Cassandra
数据库
PersistJiao3 小时前
3.基于 Temporal 的 Couchbase 动态 SQL 执行场景
数据库·sql
上山的月4 小时前
MySQL -函数和约束
数据库·mysql
zhcf4 小时前
【MySQL】十三,关于MySQL的全文索引
数据库·mysql
极限实验室4 小时前
Easysearch Chart Admin 密码自定义
数据库