DeleteRange
DeleteRange是一个操作,用于替换以下模式:用户想要删除范围[start, end]中的键的范围:
...
Slice start, end;
// set start and end
auto it = db->NewIterator(ReadOptions());
for (it->Seek(start); cmp->Compare(it->key(), end) < 0; it->Next()) {
db->Delete(WriteOptions(), it->key());
}
...
此模式需要执行范围扫描,这将阻止它成为原子操作,并使其不适合任何性能敏感的写路径。 为了缓解这种情况,RocksDB提供了一个本机操作来执行这项任务:
...
Slice start, end;
// set start and end
db->DeleteRange(WriteOptions(), start, end);
...
在引擎盖下,这创建了一个范围墓碑,表示为一个kv,这大大加快了写入性能。 与扫描和删除模式相比,range tombstone的读取性能更具竞争力。有关更详细的性能分析,请参阅DeleteRange博客文章。 ( https://rocksdb.org/blog/2018/11/21/delete-range.html )
有关实现细节,请参见此页。 ( https://github.com/facebook/rocksdb/wiki/DeleteRange-Implementation )