关于Erlang:Erlang-Mnesia中有什么与mysql中的ORDER BY类似的东西吗?

Erlang - Is there anything in Mnesia similar to ORDER BY in mysql?

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


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


直接的方法是按照@Hynek正确使用的方式使用ordered_set表类型。但是了解Mnesia中的ordered_set表时间复杂度大于set表是很有用的。

1
2
3
4
5
6
| Operation | Average | Worst Case |
|:---------:|:-------:|:----------:|
| Space     | O(n)    | O(n)       |
| Search    | O(1)    | O(n)       |
| Insert    | O(1)    | O(n)       |
| Delete    | O(1)    | O(n)       |

有序集

1
2
3
4
5
6
| 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表并采用一种算法来使记录有序。例如,一个简单而粗糙的记录可能是存储记录的计数器以跟踪记录的顺序,然后在编写记录时使记录井然有序。重要的是顺序编写它们或使用事务来避免争用情况。读取时,您可以根据在写入阶段确定的顺序来一对一地获取所需的记录。