我需要通过sender_id对mnesia记录进行分组,这是记录:
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要获取recipient_id=X
的所有记录并按sender_id
最快的方法是什么?
我认为情况是显而易见的。
答案 0 :(得分:2)
有几种方法可以解决这个问题。
获取结果并按发件人ID排序
这是迄今为止最简单的解决方案。只需像往常一样获得结果(记录列表),然后通过sender_id获取sort the records:
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
使用qlc:fold / 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
将返回包含在发件人ID密钥下分组的所有记录的结果dict
。
Erlang邮件列表是一个很好的问题和答案的宝库。我在邮件列表上找到了this question,这与您的问题非常相似。
哪个更快?
看看这些解决方案,我不确定性能会有很大差异。我想它们大致相同,但是对于qlc,在为所接收的每个项目执行所有分组逻辑期间保持锁定,因此它可以将Mnesia锁定保持更长时间。