erlang - 如何将元组内容与qlc和mnesia匹配?

时间:2009-07-21 21:23:05

标签: erlang mnesia

我有一张用于此记录的mnesia表。

-record(peer, {
    peer_key,   %% key is the tuple {FileId, PeerId}
    last_seen,
    last_event,
    uploaded = 0,
    downloaded = 0,
    left = 0,
    ip_port,
    key
}).

Peer_key是一个元组{FileId,ClientId},现在我需要从具有特定FileId的所有对等体中提取ip_port字段。

我提出了一个可行的解决方案,但我不确定这是否是一个好方法:

qlc:q([IpPort || #peer{peer_key={FileId,_}, ip_port=IpPort} <- mnesia:table(peer), FileId=:=RequiredFileId])

感谢。

2 个答案:

答案 0 :(得分:3)

在ordered_set表类型上使用像{FileId,PeerId}这样的元组主键然后部分绑定像{RequiredFileId,_}这样的元组的前缀将非常有效,因为只检查具有该前缀的键的范围,而不是全表扫描。您可以使用qlc:info / 1检查查询计划,并确保正在发生的任何选择都绑定密钥前缀。

答案 1 :(得分:0)

您的查询时间将随表格大小线性增长,因为它需要扫描所有行。因此,将其与实际表数据进行基准测试,看看它是否真的可行。

如果您需要加快速度,您应该专注于能够快速找到携带文件ID的所有对等方。这可以通过包含[fileid,peerid]属性的bag-type表来完成。给定一个文件ID,你将获得所有同行id。有了它,你可以构建你的对等表键来查找。

当然,您还需要在每个更改peer-table的事务中维护该bag-type表。

另一种选择是重复fileid并在该列上添加mnesia索引。我只是没有进入mnesia自己的二级索引。