1-Compaction:清除冗余数据,减少磁盘IO
Compaction为什么能提升查询性能,我们从leveldb的原理说起。
如图所示,数据写入leveldb的过程如下:
- 数据写入Memtable
- Memtable达到一定大小后变为Immutable Memtable
- Immutable Memtable通过Minor Compaction写入0层SSTable
数据读取流程如下:
- 从Memtable中查询;
- 从Immutable Memtable中查询;
- 遍历level 0所有文件,若未查找到,进入下一层查找
- 若未查找到,继续往下一层查询,直到查到为止或返回not found
由上述读取的流程可知,如果在level 0至level n中存在较多冗余数据,则会导致查询较多的文件,即进行多次无效的IO操作。而Compaction正是清理冗余数据的主要过程。leveldb中内置了多种compaction触发策略:
- 当每层文件数或文件大小达到阈值后,触发向下一层的compaction
- 当某个文件被查找但未找到目标值的次数达到1024次后,该文件被触发compaction
同时,我们也可以依据自己业务的特点,制定合适的触发策略。例如在业务低峰期触发,或者针对含有大量删除的范围进行compact,来及时清除冗余数据