二郎山 - 我该如何搭配QLC和Mnesia的元组内容?(erlang - how can I ma

2019-09-20 01:49发布

我有一个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])

谢谢。

Answer 1:

上有序集表型使用具有像{FILEID,的peerID}元组主密钥,然后部分地结合如{RequiredFileId,_}元组的前缀将作为仅与该前缀键的范围非常有效的将被检查,而不是一个全表扫描。 您可以使用QLC:信息/ 1检查查询计划,并确保所发生的任何选择都具有约束力的关键前缀。



Answer 2:

您的查询时间将与表的大小呈线性增长的,因为它需要通过所有的行扫描。 因此,与现实表数据的基准它,看看它是否真的是可行的。

如果您需要加快步伐,你应该专注于能够迅速发现那些带有文件ID的所有同行。 这可能与袋式用的表格来完成[FILEID,的peerID]作为属性。 给定一个文件的ID,你会得到所有的同龄人的ID。 这样,您可以构建您的同行表键查找。

当然,你还需要保持每一个改变等实体表交易内部的袋型表。

另一种选择是重复的fileid,并在该列中添加一个Mnesia指数。 我只是没有那么Mnesia的自己的二级指标。



文章来源: erlang - how can I match tuple contents with qlc and mnesia?
标签: erlang mnesia