4

我有这个记录的记忆表。

-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 的 peer 中提取 ip_port 字段。

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

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

谢谢。

4

2 回答 2

3

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

于 2009-07-23T14:42:15.930 回答
0

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

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

当然,您还需要在更改对等表的每个事务中维护该袋型表。

另一种选择是重复 fileid 并在该列上添加一个 mnesia 索引。我只是不喜欢 mnesia 自己的二级索引。

于 2009-07-22T00:14:15.347 回答