gpt4 book ai didi

erlang - Mnesia:根据涉及多个索引列的条件选择行时如何正确使用索引操作

转载 作者:行者123 更新时间:2023-12-01 01:14:21 26 4
gpt4 key购买 nike

问题:

如何从表中有效地选择记录,其中选择基于涉及两个索引列的条件。

例子

我有记录,

#rec{key, value, type, last_update, other_stuff}
  • 我有键(默认)、类型和 last_update 列的索引
  • type 通常是原子或字符串
  • last_update 是一个整数(自 1970 年以来的 Unix 风格的毫秒数)

  • 例如,我想要所有类型 = Type 并且自特定时间戳以来已更新的记录。

    我执行以下操作(包含在非脏事务中)
    lookup_by_type(Type, Since) ->
    MatchHead = #rec{type=Type, last_update = '$1', _= '_'},
    Guard = {'>', '$1', Since},
    Result = '$_',
    case mnesia:select(rec,[{MatchHead, [Guard],[Result]}]) of
    [] -> {error, not_found};
    Rslts -> {ok, Rslts}
    end.


  • lookup_by_type 函数甚至使用基础索引吗?
  • 在这种情况下,是否有更好的方法来利用索引
  • 我应该采取完全不同的方法吗?

  • 谢谢你们

    最佳答案

    一种可能会对您有所帮助的方法是查看 QLC 查询。这些是更多的 SQL/声明性的,如果可能的话,它们将利用 IIRC 自己的索引。

    但主要问题是 mnesia 中的索引是散列,因此不支持范围查询。因此,您只能有效地索引 type字段当前而不是在 last_update field 。

    一种解决方法是制作表格 ordered_set然后推last_update成为主键。 key如果您需要快速访问参数,则可以对参数进行索引。一种存储可能性类似于:{{last_update, key}, key, type, ...} .因此您可以快速回答查询,因为 last_update是可订购的。

    另一种解决方法是单独存储上次更新。保留一张 table {last_update, key}这是一个有序集,并使用它来限制要在查询中的较大表上扫描的事物数量。

    请记住,mnesia 最好用作小型内存数据库。因此,扫描不一定是问题,因为它们在内存中,因此速度非常快。不过,它的主要功能是能够以肮脏的方式对数据进行键/值查找以进行快速查询。

    关于erlang - Mnesia:根据涉及多个索引列的条件选择行时如何正确使用索引操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934505/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com