一次minorcompaction的产出是一个0层的sstable文件,其中包含了所有的内存数据。但是若干个0层文件中是可能存在数据overlap的。

    正如前面的文章提到,leveldb是一个写效率十分高的存储引擎,存储的过程非常简单,只需要一次顺序的文件写和一个时间复杂度为O(logn)的内存操作即可。

    假设leveldb中就是以这样的方式进行数据维护,那么随着运行时间的增长,0层的文件个数会越来越多,在最差的情况下,查询一个数据需要遍历所有的数据文件,这显然是不可接受的。因此leveldb设计了一个MajorCompaction的过程,将0层中的文件合并为若干个没有数据重叠的1层文件。

    对于没有数据重叠的文件,一次查找过程就可以进行优化,最多只需要一个文件的遍历即可完成。因此,leveldb设计compaction的目的之一就是为了提高读取的效率

    但是当用户写入的速度始终大于majorcompaction的速度时,就会导致0层的文件数量还是不断上升,用户的读取效率持续下降。所以leveldb中规定:

    • 当0层文件数量超过时,写入的速度主要减慢;

    故compaction也可以起到平衡读写差异的作用。

    为了尽量减少数据集所占用的磁盘空间大小,leveldb在majorcompaction的过程中,对不同版本的数据项进行合并。