erlang - 如何将元组内容与 qlc 和 mnesia 匹配?

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

我想出了一个可行的解决方案,但我不确定这是否是一个好方法:
qlc:q([IpPort || #peer{peer_key={FileId,_}, ip_port=IpPort} <- mnesia:table(peer), FileId=:=RequiredFileId])

谢谢。

最佳答案

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

关于erlang - 如何将元组内容与 qlc 和 mnesia 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1161831/

相关文章:

database - 如何在 Elixir 中创建 mnesia 表?

database-design - Mnesia 中 set 和ordered_set 之间的区别?

ejabberd - 如何阻止 ejabberd 使用 mnesia

erlang - Erlang中修改默认 'home'路径解决RabbitMQ启动错误

python - Erlang 和 Python 之间的 RSA 加密

erlang - 如何在erlang中禁止ctrl+c

functional-programming - 我应在多大程度上采用参照透明性?

erlang - 在 Erlang 中实现高效的二分查找

Erlang:用于流程的简单pubsub-我的方法还好吗?

mysql - Ejabberd mnesia 数据库到 mysql