固定大小键的最快持久键/值db,只插入/获取(不删除/更新)?

时间:2014-06-05 01:28:55

标签: database leveldb acid rocksdb nosql

考虑到持久性键/值存储的以下要求:

  • 仅需要获取,插入和完全迭代所有值(用于导出)
  • 不删除值或更新值
  • 键总是一样大小
  • 嵌入在主机应用程序中的代码

考虑到这种使用模式:

  • 提取是随机的
  • 插入和提取是交错的,没有可预测性
  • 键是随机的,并以随机顺序插入

根据要求,最佳的磁盘数据结构/算法是什么?

自定义实现是否可以超过基于LSM(Log Structured Merge)实现(即leveldb,rocksdb)的性能?

这些要求的高性能自定义实现在实现中是否也会相当简单?

1 个答案:

答案 0 :(得分:4)

虽然可能有更好的性能自定义实现满足您的要求,但配置良好的RocksDB应该能够胜过大多数此类自定义实现。以下是我将配置RocksDB的内容:

首先,由于您没有更新和删除,因此最好将所有数据压缩到RocksDB中的大文件。因为RocksDB以可自定义的顺序对这些键进行排序,所以拥有一些大文件可以提高读取性能,因为跨一些大文件的二进制搜索比跨多个小文件更快。通常,拥有大文件会损害压缩的性能 - 重新组织RocksDB中的大部分数据的过程,以便1.合并与单个密钥相关的多个更新; 2.执行删除以释放磁盘空间; 3.保持数据排序。但是,由于您没有更新和删除,因此使用大文件可以提供快速的读写性能。

其次,为bloom过滤器指定大位,这样,当您可能发出一些ROCKDB中不存在密钥的查询时,可以避免大多数IO。

所以读取请求是这样的。首先,它将查询键与这些大文件的键范围进行比较,以确定查询键可能位于哪个文件中。然后,一旦密钥范围覆盖查询密钥的文件,它将计算查询密钥的bloom位以查看查询密钥是否可能存在于那些文件中。如果是这样,那么将触发每个文件内的二进制搜索以识别匹配的数据。

对于扫描操作,由于RocksDB在内部按用户自定义顺序对数据进行排序,因此可以使用RocksDB的迭代器非常有效地进行扫描。

有关RocksDB基础知识的更多信息,请参阅here