2009-07-21 74 views
4

我有这个记录mnesia表。erlang - 如何将元组内容与qlc和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,客户端Id},现在我需要从具有特定的fileid所有同行提取ip_port领域。

我想出了一个可行的解决方案,但我不知道这是一个好办法:

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

感谢。

回答

3

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

0

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

如果您需要加快速度,您应该专注于能够快速找到所有带有文件ID的对等点。这可以通过一个包含[fileid,peerid]的袋子类型的表作为属性来完成。给定一个文件的ID你会得到所有的同行ID。有了这个,你可以构建你的对等表键来查找。

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

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