问题 如何在键/值存储之上构建数据库索引?


我正在读书 性LevelDB 并发现:

即将推出的Chrome浏览器版本包括构建在LevelDB之上的IndexedDB HTML5 API的实现

IndexedDB的 也是一个简单的键/值存储,能够索引数据。

我的问题是: 如何在键/值存储之上构建索引?我知道索引处于最低级别是n-ary树,我理解数据在数据库中索引的方式。但是如何使用像LevelDB这样的键/值存储来创建数据库索引呢?


1967
2018-01-28 17:39


起源

@AndyDent答案很好。要了解在实践中如何完成检查 github.com/ren85/linqdb - ren
LevelDB基于lsm-tree,而不是B-tree。 - Helin Wang


答案:


重要的特征并不是它支持自定义比较器,而是支持通过键进行有序迭代,从而搜索部分键。您可以使用约定来分隔字符串值来模拟键中的字段。位于leveldb之上的许多脚本层都使用这种方法。

字典视图 键值存储的一个原因是,您只能通过完全匹配来判断键是否存在。使用它并不是真的可行 只是 这样的KV商店作为数据库索引的基础。

只要您可以从部分匹配开始迭代键,就足以为索引提供搜索和排序操作。


7
2018-06-30 15:53





只需要做一些事情,LevelDB支持使用自定义比较器对数据进行排序 您链接到的页面

根据项目现场,主要特点是:

  • 键和值是任意字节数组。
  • 按键排序存储数据。
  • 调用者可以提供自定义比较功能来覆盖排序顺序。
  • ....

因此,LevelDB可以包含可以根据1个排序顺序对数据进行排序/索引的数据。

如果您需要多个可索引字段,则可以添加自己的B-Tree,它在LevelDB之上工作。我想这是Chrome浏览器采用的那种方法,但我只是在猜测。

你总能看透 Chrome源码


5
2018-01-28 20:30



你不需要在leveldb上使用B树,而是应该创建另一个leveldb作为每个字段的索引。 (实际上模仿了在向表中添加索引时关系数据库的作用)但是当我查看leveldb时,我没有看到交叉数据库事务。 - Dan D.
@DanD。我同意那个!评论+1!我还要补充一点: 是的,没有交易,但你确实有批量写入 并且你确实有很多其他功能接近ACID交易。 - Kiril
@Lirik“交叉数据库事务”的含义是什么 涉及多个leveldb实例的原子操作 哪个leveldb没有支持。尽管leveldb确实支持单个leveldb实例上的原子操作,但您无法在多个leveldb实例上构建原子操作。 - Dan D.
@DanD。啊,是的......这是正确的,我没有在“跨数据库交易”中看到“交叉”。 - Kiril
你为什么需要一个单独的leveldb?只需将“索引”对与“记录”对混合即可。 - Andy Dent