【发布时间】:2016-03-14 13:38:01
【问题描述】:
我可以从 mnesia 中对获得的数据进行排序,但想知道是否可以在从 mnesia 查询时对数据进行排序,类似于在 mysql 中使用 ORDER BY
【问题讨论】:
我可以从 mnesia 中对获得的数据进行排序,但想知道是否可以在从 mnesia 查询时对数据进行排序,类似于在 mysql 中使用 ORDER BY
【问题讨论】:
如果您有ordered_set,则您已经按键排序。否则,您可以使用lists:sort/2。对于通过复杂结构内部的键或许多此类键进行排序,您可以使用Schwartzian_transform 即lists:sort/1 和两个lists:map/2 或列表理解的组合来加快排序。对于更大数量的数据,请考虑file_sorter。
【讨论】:
直接的方法是使用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 表并采用算法对记录进行排序。例如,一个简单且粗略的方法可能是存储您的记录计数器以跟踪他们的订单,然后在编写记录时对您的记录进行排序。重要的是按顺序编写它们或使用事务以避免竞争条件。阅读时,您可以根据您在写入阶段确定的顺序逐一获取所需的记录。
【讨论】: