Mnesia:包表类型是如何实现的?

cit*_*txx 2 erlang mnesia

我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从这个表中获取过期时间少于现在的记录并删除它们。

Erlang的文件说,有四种类型的表类型:setordered_setbag,和duplicate_bag

  • set 使用哈希表实现,因此读取时间复杂度为 O(1)。
  • ordered_set 是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地适用于随后的间隔。
  • 我没有找到有关bag实施的信息。

ordered_set看起来很理想,但我不能使用它,因为两条记录可以具有相同的时间戳。所以问题是:

bag表是如何实现的,是否适合查询后续间隔?如果没有,我怎样才能获得“ ordered_bag”功能?

zaq*_*est 5

Mnesiabag是使用ETSand实现的DETS,其他表类型 [1] 也是如此。此外,Mnesia 不支持duplicate_bag表格 - 您可以从文档 [2] 中看到它。因此,我们可以得出结论bag,Mnesia 被实现为哈希表并且具有恒定的查找时间,因为ETSDETS bag被实现为哈希表 [3]。[4] 也说setbag在 Mnesia 中作为哈希表实现。

  1. 向你学习一些 Erlang
  2. Erlang -- mnesia:create_table/2
  3. Erlang Programming 作者 Fransecso Cesarini 和 Simon Thompson,第 10 章
  4. Erlang 和 OTP in Action 作者:Martin Logan、Eric Merritt 和 Richard Carlsson,第 9 章

关于剩下的问题:

不,bag不适合查询后续间隔。要从bag表中获取间隔,您必须完全遍历它。我看到了两个可能的决定。

首先ordered_set正如@niahoo 建议的那样,您可以使用附加表来保持秩序。因此,您将能够有效地查询一个区间内的所有时间戳,然后从bag表中删除相应的条目,这也将是有效的,因为此时您将知道所有键。

其次,你可以使用ordered_set{timestamp, [values]}。这将需要额外的手动操作来插入和删除单个条目,但如果您只需要按timestamp.