#### 15.9.1.1 表压缩概述

[](<>)

由于处理器和高速缓存存储器的速度增加超过磁盘存储设备，因此许多工作负载是[磁盘绑定](glossary.html#glos_disk_bound).数据[压缩](glossary.html#glos_compression)以增加 CPU 利用率的小成本实现更小的数据库大小、减少的 I/O 和提高的吞吐量。压缩对于读取密集型应用程序特别有价值，在具有足够 RAM 以将常用数据保存在内存中的系统上。

一个`InnoDB`创建的表`ROW_FORMAT=压缩`可以使用更小的[页面大小](glossary.html#glos_page_size)在磁盘上比配置[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)价值。较小的页面需要较少的 I/O 来读取和写入磁盘，这对于[固态硬盘](glossary.html#glos_ssd)设备。

压缩页面大小通过[`创建表`](create-table.html)要么[`更改表`](alter-table.html) `KEY_BLOCK_SIZE`范围。不同的页面大小要求将表格放在一个[每表文件](glossary.html#glos_file_per_table)表空间或[通用表空间](glossary.html#glos_general_tablespace)而不是在[系统表空间](glossary.html#glos_system_tablespace)，因为系统表空间不能存储压缩表。有关详细信息，请参阅[第 15.6.3.2 节，“File-Per-Table 表空间”](innodb-file-per-table-tablespaces.html)， 和[第 15.6.3.3 节，“通用表空间”](general-tablespaces.html).

压缩级别是相同的，无论`KEY_BLOCK_SIZE`价值。当您为`KEY_BLOCK_SIZE`，您将获得越来越小的页面的 I/O 优势。但是，如果您指定的值太小，则当数据值无法压缩到足以容纳每页中的多行时，重新组织页面会产生额外的开销。有多小是有硬性限制的`KEY_BLOCK_SIZE`可以用于表，基于其每个索引的键列的长度。指定一个太小的值，并且[`创建表`](create-table.html)要么[`更改表`](alter-table.html)声明失败。

在缓冲池中，压缩数据保存在小页面中，页面大小基于`KEY_BLOCK_SIZE`价值。为了提取或更新列值，MySQL 还使用未压缩数据在缓冲池中创建一个未压缩页面。在缓冲池中，对未压缩页面的任何更新也会重新写回等效的压缩页面。您可能需要调整缓冲池的大小以容纳压缩和未压缩页面的附加数据，尽管未压缩页面是[被驱逐](glossary.html#glos_eviction)当需要空间时从缓冲池中提取，然后在下次访问时再次解压缩。
