由于处理器和缓存内存的速度增长速度超过磁盘存储设备,因此许多工作负载都是 磁盘绑定。数据 压缩 可以实现较小的数据库大小、减少 I/O 和提高吞吐量,以小的 CPU 利用率为代价。压缩对于读取密集型应用程序尤其有价值,特别是在具有足够 RAM 的系统中,可以将频繁使用的数据保持在内存中。
使用 ROW_FORMAT=COMPRESSED
创建的 InnoDB
表可以在磁盘上使用比配置的 页大小 小的页大小。较小的页大小需要从磁盘读取和写入的 I/O 少,特别是在 固态硬盘 设备上尤其有价值。
压缩页大小通过 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 还在缓冲池中创建一个未压缩的页,以便访问未压缩的数据。在缓冲池中,对未压缩页的任何更新也将被重新写回相应的压缩页。您可能需要调整缓冲池的大小,以容纳压缩和未压缩页的额外数据,尽管未压缩页将在缓冲池中被 驱逐,然后在下一次访问时重新解压缩。