17.9.1.1 表压缩概述
由于处理器和缓存内存的速度增加,而磁盘存储设备的速度没有相应增加,许多工作负载都是磁盘 bound。数据压缩可以使数据库大小减小、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
指定较小的值,您将获得 increasingly smaller 页面的I/O优势。但如果您指定了太小的值,那么当数据值不能被压缩到每个页面中多行时,需要额外的重组页面的开销。对表的KEY_BLOCK_SIZE
有一个硬限制,这基于其索引中的键列长度。如果指定了太小的值,则CREATE TABLE
或ALTER TABLE
语句将失败。
在缓冲池中,压缩后的数据被存储在小页面中,这些页面的大小基于KEY_BLOCK_SIZE
值。为了提取或更新列值,MySQL还在缓冲池中创建了一个未压缩的页面,其中包含未压缩的数据。在缓冲池中,对于未压缩页面的任何更新都将被重新写回到等效的压缩页面。你可能需要根据压缩和未压缩页面的额外数据来 sizing your buffer pool,虽然未压缩页面在需要空间时会被驱逐从缓冲池,然后在下一次访问时重新压缩。