子压缩

在这里,我们解释了在级别压缩和通用压缩中使用的子压缩。

目标

子压缩的目标是通过在多个线程之间进行分区来加快压缩作业的速度。

何时

在符合下列条件之一时使用:

  • L0 -> Lo where o > 0
  • 通用压缩,除了L0 -> L0。
  • 手工平整压缩: Li -> Lo,其中o > 0
    • 原因:用户调用的手动压缩通常不并行化,因此分区有好处。

注意: 如果没有与目标级别Lo中的任何文件合并,则禁用sub-compaction子压缩。 有关详细信息,请参考Compaction::ShouldFormSubcompactions。

如何使用

目前,它基于一种迄今为止效果良好的启发式。启发式可以在许多方面得到改进。

  1. 根据 输入级别/文件 的自然边界选择边界。
    • L0文件的第一个和最后一个键
    • 第一个和最后一个键的非0,非最后一级
    • 上一层每个SST文件的第一个键
  2. 使用 Versions::ApproximateSize 估计每个边界中的数据大小。
  3. 合并边界以消除空的和小于平均值的范围。
    • 找出每个范围的平均大小
    • 从开始贪婪地合并相邻范围,直到它们的总大小超过平均值