我有一张用于此记录的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])
感谢。
答案 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自己的二级索引。