database - 处理rocksdb中的重复项

标签 database duplicates environment rocksdb

我想使用rocksdb,并想明确地知道它如何处理重复项。

文档说:

The entire database is stored in a set of sstfiles. When a memtable is full, 
its content is written out to a file in Level-0 (L0). RocksDB removes 
duplicate and overwritten keys in the memtable when it is flushed to a file in L0.

现在,在拥有多个数据库的环境的情况下,我找不到描述。 在这种情况下, key 在整个环境中是唯一的还是每个数据库都有其唯一的 key ?我找不到整个环境的行为描述。

最佳答案

对你的问题的简短回答:有一个称为压缩的后台进程,它会定期将几个 sst 文件合并到单个排序运行中(此排序运行可以表示为多个 sst 文件,但每个文件都有不相交的键范围。 )在此压缩过程中,它会处理重复的键。

这是您问题的详细答案:

RocksDB 是 LSM数据库。当一个键值对写入 RocksDB 时,RocksDB 只需为其创建一个数据条目并将其附加到名为 MemTable 的内存缓冲区中。

当MemTable变满时,RocksDB将对所有键进行排序并将它们作为单个sst文件刷新。随着我们不断写入更多数据,将会有更多 sst 文件被刷新,其中每个 sst 文件通常都有重叠的键范围。此时,假设我们有 N 个 sst 文件,并且有一个读取请求进来。那么这个读取请求必须检查所有这 N 个 sst 文件以查看它是否包含所请求的 key ,因为每个 sst 文件可以具有重叠的 key 范围。因此,如果没有任何过程来重新组织这些 sst 文件,随着我们不断写入更多数据,读取速度将会变慢。

重新组织这些 sst 文件的过程称为压缩,它本质上是一种类似于多路合并排序的操作,输入多个 sst 文件并输出单个排序运行。在压缩过程中,RocksDB 将对这些输入 sst 文件中的所有键进行排序,合并可能的数据条目,并在找到匹配的删除条目时删除数据条目。

关于database - 处理rocksdb中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32075780/

相关文章:

database - DB2 操作超时或死锁

mysql - MySQL 中的产品和订单表结构

mysql - 获取我的查询的多个结果

python - 删除*几乎*重复的观察 - Python

google-app-engine - Google App Engine 标准环境还是灵活环境?

amazon-web-services - 如何使用 cdk 管道在不同的环境(dev、uat、prod)中部署?

mysql - 给定一个形式为 "select a,b,c from t"的 SQL 语句及其输出,你能确定表 t 中的列数吗?

java - 允许重复、保持插入顺序并允许删除和插入的结构

C# 在操作系统windows中设置环境变量(不执行)

javascript - 如何使用 Array.prototype.sort() 对具有重复值的数组进行排序?