【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底层概述—1.InnoDB内存结构
java·数据库·mysql
standxy3 小时前
通过轻易云平台实现聚水潭数据高效集成到MySQL的技术方案
android·数据库·mysql
itwangyang5203 小时前
2025 - 科研神器 - 批量处理 PDF、SVG、PNG 和 JPG 文件,将它们转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中
数据库·pdf
痞老板A小安装C43 小时前
redis的大key和热key问题解决方案
数据库·redis·bootstrap
feilieren3 小时前
DataGrip 连接 Redis、TongRDS
数据库·redis·缓存
苹果酱05673 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
液态不合群3 小时前
Redis中常见的数据类型及其应用场景
数据库·redis·wpf
Allen Bright4 小时前
Jedis存储一个-以String的形式的对象到Redis
数据库·redis·缓存
Allen Bright5 小时前
Jedis存储一个以byte[]的形式的对象到Redis
数据库·redis·缓存
NiNg_1_2345 小时前
Redis中的zset用法详解
数据库·redis·缓存