【问题标题】:erlang - how can I match tuple contents with qlc and mnesia?erlang - 如何将元组内容与 qlc 和 mnesia 匹配?
【发布时间】:2010-11-12 19:22:26
【问题描述】:

我有这个记录的记忆表。

-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])

谢谢。

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-19
        • 2011-10-18
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多