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