Erlang 在恒定时间内查找Mnesia中列的最大/最小值

Erlang 在恒定时间内查找Mnesia中列的最大/最小值,erlang,mnesia,Erlang,Mnesia,如何在恒定时间(或尽可能接近的时间)内找到Mnesia表中索引列的最大值或最小值?这是一个好问题,但我认为这是不可能的。快速浏览mnesia和qlc文档并没有给我任何关于这个主题的线索 在我看来,mnesia中的辅助键设施是不完整的,因此在功能上非常有限。更不用说加载索引表时可怕的mnesia启动时间了 我认为在您的情况下,最可靠的解决方案是进行显式索引。例如,创建表并与主键上的排序保持同步,主键实际上是您希望索引的值。我会在Mnesia数据库之外执行此操作。保持显式最小值和显式最大值,方法是让

如何在恒定时间(或尽可能接近的时间)内找到Mnesia表中索引列的最大值或最小值?

这是一个好问题,但我认为这是不可能的。快速浏览mnesia和qlc文档并没有给我任何关于这个主题的线索

在我看来,mnesia中的辅助键设施是不完整的,因此在功能上非常有限。更不用说加载索引表时可怕的mnesia启动时间了


我认为在您的情况下,最可靠的解决方案是进行显式索引。例如,创建表并与主键上的排序保持同步,主键实际上是您希望索引的值。

我会在Mnesia数据库之外执行此操作。保持显式最小值和显式最大值,方法是让一个进程在表中插入时了解这些值。这使您可以非常快速地对值进行常量时间查找

如果你能使用O(lgn)时间,那么你就可以使桌子成为一个有序的集合。从这里开始,
first/1
last/1
应该会给你想要的东西,因为钥匙包含你要订购的东西。但这也会使其他查询的速度减慢到O(lgn)


第三个技巧是通过一个近似值。偶尔扫描一下表格,记下最大值和最小值。这会具体化为您想要的内容,但如果您上次扫描的时间过长,则该值可能不是最新值。

我认为您可能是对的,但如果是这样的话,感觉会很糟糕!回答得好!你给出了三种不同的处理方法。关于你的第一个建议,有一个问题是,有没有一种简单的方法可以透明地“倾听”插入到Mnesia表中,或者我需要制作一个包装器来代替它?你需要一个包装器。或者你需要把它放在交易的内部。