由于处理器和高速缓存存储器的速度提高超过了磁盘存储设备,因此许多工作负载都 受限于磁盘。数据 压缩可以更小的数据库大小、减少 I/O 和提高吞吐量,而以增加 CPU 利用率为代价。压缩对于读取密集型应用程序特别有价值,在具有足够 RAM 的系统上可以将频繁使用的数据保存在内存中。
使用创建的 InnoDB 表
可以在磁盘上ROW_FORMAT=COMPRESSED
使用比通常的 16KB 默认值更小的
页面大小。较小的页面需要较少的 I/O 来读取和写入磁盘,这对于
SSD设备特别有价值。
页面大小通过
KEY_BLOCK_SIZE
参数指定。不同的页面大小意味着该表必须在其自己的.ibd
文件中而不是在
系统表空间中,这需要启用该
innodb_file_per_table
选项。无论值如何,压缩级别都是相同的
KEY_BLOCK_SIZE
。当您为 指定较小的值时KEY_BLOCK_SIZE
,您将获得越来越小的页面的 I/O 优势。但是,如果您指定的值太小,则当数据值无法压缩到足以容纳每页中的多行时,重新组织页面会产生额外的开销。有多小有一个硬性限制
KEY_BLOCK_SIZE
可以用于表,基于其每个索引的键列的长度。指定的值太小,CREATE
TABLE
orALTER TABLE
语句失败。
在缓冲池中,压缩数据保存在小页面中,页面大小基于KEY_BLOCK_SIZE
值。为了提取或更新列值,MySQL 还在缓冲池中使用未压缩的数据创建一个 16KB 的页面。在缓冲池中,对未压缩页面的任何更新也将重新写回等效的压缩页面。您可能需要调整缓冲池的大小以容纳压缩页面和未压缩页面的额外数据,尽管未压缩页面在
需要空间时会从缓冲池中逐出,然后在下一次访问时再次解压缩。