Erlang - Mnesia中有什么类似于mysql中的ORDER BY吗?

时间:2015-12-09 10:13:25

标签: erlang mnesia

我可以从mnesia订购获得的数据但是想知道是否可以在从mnesia查询时对数据进行排序,类似于在mysql中使用ORDER BY

2 个答案:

答案 0 :(得分:1)

如果您有ordered_set,则表示您已按键排序。否则,您可以使用lists:sort/2。对于通过复杂结构内部的键或许多此类键进行排序,您可以使用Schwartzian_transform加快排序,即lists:sort/1和两个lists:map/2的组合或列表理解。对于更大量的数据,请考虑file_sorter

答案 1 :(得分:0)

直截了当的方法是使用ordered_set表格类型正确告知@Hynek。但是,知道ordered_set表的时间复杂度超过Mnesia中的set表是有用的。

设置

| Operation | Average | Worst Case |
|:---------:|:-------:|:----------:|
| Space     | O(n)    | O(n)       |
| Search    | O(1)    | O(n)       |
| Insert    | O(1)    | O(n)       |
| Delete    | O(1)    | O(n)       |

有序集

| Operation | Average  | Worst Case |
|:---------:|:--------:|:----------:|
| Space     | O(n)     | O(n)       |
| Search    | O(log n) | O(n)       |
| Insert    | O(log n) | O(n)       |
| Delete    | O(log n) | O(n)       |

如果ordered_set表的成本不可承受,您可以考虑使用set表并使用算法来记录您的记录。例如,一个简单的粗略可以存储记录的计数器以跟踪他们的订单,然后在编写记录时订购记录。重要的是按顺序编写它们或使用事务来避免竞争条件。阅读时,您可以根据您在写入阶段确定的顺序逐个获取所需的记录。