表压缩概述
本节描述InnoDB
表压缩,InnoDB
驻留在 file_per_table 表空间或常规表空间中的表支持此压缩。使用ROW_FORMAT=COMPRESSED
属性CREATE TABLE
或启用表压缩ALTER TABLE
。
因为处理器和高速缓存的速度比磁盘存储设备的速度增加了,所以许多工作负载都是磁盘绑定的。数据压缩以增加CPU利用率为代价,实现了较小的数据库大小,减少的I / O和改进的吞吐量。在具有足够RAM以便将经常使用的数据保留在内存中的系统上,压缩对于读取密集型应用程序特别有价值。
使用InnoDB
创建的表在磁盘上ROW_FORMAT=COMPRESSED
使用的页面大小可以小于配置的innodb_page_size
值。较小的页面需要更少的I / O来读取和写入磁盘,这对于SSD设备而言尤其有价值。
压缩的页面大小通过CREATE TABLE
或参数指定。不同的页面大小要求将表放置在每表文件表空间或常规表空间中,而不是系统表空间中,因为系统表空间无法存储压缩表。有关更多信息,请参见“每表文件表空间”和“常规表空间”。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还使用未压缩的数据在缓冲池中创建了未压缩的页面。在缓冲池中,对未压缩页面的任何更新也将重新写回到等效的压缩页面。您可能需要调整缓冲池的大小以容纳压缩和未压缩页面的其他数据,尽管需要空间时会从缓冲池中清除未压缩的页面,然后在下次访问时再次将其解压缩。