购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.6 压缩

存储原始的、未压缩的数据会导致显著的开销,因此许多数据库提供了压缩数据的方法以节省存储空间。这里显然是要在访问速度和压缩率之间进行权衡:较大的压缩率可以提升数据存储空间利用率,允许你在一次访问中获取更多的数据,但这可能需要更多的内存和CPU周期来进行压缩和解压缩。

我们可以在不同的粒度级别上进行压缩。尽管压缩整个文件可以产生更好的压缩率,但由于整个文件必须在更新时被重新压缩,所以它的应用有限。更细粒度的压缩通常更适合较大的数据集。压缩整个索引文件既不切实际也难以高效实现:为了寻址一个特定页,必须访问整个文件或其包含压缩元数据的段(以便定位一个已压缩的段),然后将其解压缩并使其可用。

另一种选择是按页压缩数据。它很适合我们所讨论的情形,因为到目前为止我们讨论的算法都使用固定大小的页。页可以独立地进行压缩和解压缩,从而允许你将压缩与页的加载和刷盘耦合起来。然而,这样一来,被压缩的页只能占用磁盘块的一部分。并且,由于传输通常以磁盘块为单位进行,所以可能需要换入额外的字节[RAY95]。在图4-10中,你可以看到压缩页(a)占用的空间小于磁盘块,当我们加载该页时,我们还会换入属于另一页的额外字节。对于跨越多个磁盘块的页,如图4-10b,我们必须读取一个附加的块。

图4-10:压缩和块填充

另一种方法是仅压缩数据,要么按行(压缩整条数据记录),要么按列(对每一列进行压缩)。在这种情况下,页的管理和压缩是解耦的。

在撰写本书时参考的大多数开源数据库都使用了可插拔的压缩方法,其使用现成的库,例如Snappy、zLib、lz4等。

由于压缩算法会根据数据集和潜在目标(例如压缩比、性能或内存开销)而产生不同的结果,所以在本书中我们将不再进行深入的比较和对实现细节的讨论。针对不同的块大小评估不同的压缩算法的综述有很多(例如Squash Compression Benchmark),其通常集中在四个衡量指标上:内存开销、压缩性能、解压缩性能和压缩比。在选择压缩库时,这些指标是非常重要的。 NKEpRJTdpn3G79ns+fUCZDGqYbtpeuFPT6z5DgSUXprolHMX8fJos5UF496NNoZX

点击中间区域
呼出菜单
上一章
目录
下一章
×