由于处理器和缓存内存的速度增长快于磁盘存储设备,因此许多工作负载是磁盘绑定的。数据压缩可以使数据库尺寸更小,减少 I/O,并提高吞吐量,而只需付出少量 CPU 使用率增加的代价。压缩对于读密集型应用程序特别有用,尤其是对于那些有足够的 RAM 将常用数据保留在内存中的系统。
使用 ROW_FORMAT=COMPRESSED
创建的 InnoDB
表可以在磁盘上使用比配置的 innodb_page_size
值更小的页面大小。较小的页面需要更少的 I/O 来读取和写入磁盘,这对于SSD 设备特别有用。
压缩页面大小通过CREATE TABLE
或 ALTER TABLE
的 KEY_BLOCK_SIZE
参数指定。不同的页面大小要求该表被放置在每表文件 表空间或通用表空间 中,而不是在系统表空间 中,因为系统表空间无法存储压缩表。有关更多信息,请参见第 17.6.3.2 节,“每表文件表空间” 和第 17.6.3.3 节,“通用表空间”。
压缩级别与 KEY_BLOCK_SIZE
值无关。当您为 KEY_BLOCK_SIZE
指定较小的值时,您将获得越来越小的页面的 I/O 优势。但是,如果您指定的值太小,则当数据值无法压缩到足以将多行放入每个页面时,就会产生额外的开销来重新组织页面。对于表,KEY_BLOCK_SIZE
可以有多小存在硬性限制,这取决于其每个索引的键列的长度。如果指定的值太小,CREATE TABLE
或 ALTER TABLE
语句将失败。
在缓冲池中,压缩数据以基于 KEY_BLOCK_SIZE
值的页面大小保存在较小的页面中。为了提取或更新列值,MySQL 还会在缓冲池中创建一个包含未压缩数据的未压缩页面。在缓冲池中,对未压缩页面的任何更新也将重新写入到等效的压缩页面。您可能需要调整缓冲池的大小以适应压缩和未压缩页面的额外数据,尽管当需要空间时,未压缩页面会被逐出 缓冲池,然后在下一次访问时重新解压缩。