我需要通过SENDER_ID组Mnesia的记载,这里是记录:如何组通过Mnesia的返回由ID对象:match_object功能
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要sender_id
获取所有记录,其中recipient_id=X
和他们组
什么是最快的方法呢?
我认为情况是显而易见的。
我需要通过SENDER_ID组Mnesia的记载,这里是记录:如何组通过Mnesia的返回由ID对象:match_object功能
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要sender_id
获取所有记录,其中recipient_id=X
和他们组
什么是最快的方法呢?
我认为情况是显而易见的。
有几种方法可以解决这个问题。
得到的结果和SENDER_ID
这是迄今为止最简单的解决方案对它们进行排序。刚刚得到的结果(记录列表),你通常会和sort the records通过SENDER_ID:
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
使用QLC:折叠/ 3
这是更复杂一点,但它似乎有点使用普通老lists:sort/2
更优雅。而不是返回一个列表它返回一个字典。
select_grouped_pms_for_recipient(RecipientId) ->
Q = qlc:q([E || E <- mnesia:table(pm), E#pm.recipient_id == RecipientId]),
qlc:fold(fun group/2, dict:new(), Q).
group(Record, Acc) ->
dict:append(Record#pm.sender_id, Record, Acc).
在group/2
函数我们推记录到用于在dict
累加器发送者ID的值的列表。 select_grouped_pms_for_recipient/1
将返回结果dict
,其中包含在发件人ID密钥下分组的所有记录的列表。
Erlang邮件列表是一个好问题和答案的宝库。我在邮件列表中找到this question,这与您的问题非常相似。
哪个更快?
看着这些解决方案,我不确定在性能上会有很大的差异。我想他们大致相同,但是对于每个接收到的项目,在执行所有分组逻辑的过程中,通过qlc保持锁定,因此它可以将Mnesia锁持续一段时间。
您使用的是什么版本的Erlang? – Stratus3D