使用前缀匹配/从健忘症中选择

asi*_*sim 2 erlang mnesia

我有一个含ID,名称,城市等字段的mnesia表...我想使用前缀选择/匹配名称,例如,如果有多个名称以“ joe”开头的记录,我想高效地选择所有记录无需重复所有记录。

就像sql查询“从mytbl中选择id,其中的名字像joe%”一样。谢谢

更新:

基于1000条记录的基准:

MySql(名称也是主键):450-500微秒

Mnesia实际表格(非关键):300-370微秒

以名称为键的单独的ordered_set失忆表:60-108微秒

注意: mnesia表仅是ram,即使在为实际表命名字段之后,我也没有注意到任何性能差异。

leg*_*cia 6

就像是:

mnesia:select(mytbl, ets:fun2ms(fun(#mytbl{name = "joe" ++ _, id = Id}) -> Id end)).
Run Code Online (Sandbox Code Playgroud)

要么

mnesia:select(mytbl, [{#mytbl{name = "joe" ++ '_', id = '$1', _ = '_'},[],['$1']}]).
Run Code Online (Sandbox Code Playgroud)

(这是一个匹配规范。这两个变体是等效的,但通常更清楚地用于ets:fun2ms生成匹配规范。-include_lib("stdlib/include/ms_transform.hrl").编译器需要接受该规范。请注意,如果您在shell中进行尝试,则只有后者将工作,因为不一致如何++被处理的ets:fun2ms。)

请注意,除非您的表是类型且是主键,否则此操作仍将在所有记录中进行迭代。ordered_setname


如果您想获取完整记录,而不仅仅是id字段,那么将是:

mnesia:select(mytbl, ets:fun2ms(fun(#mytbl{name = "joe" ++ _} = X) -> X end)).
Run Code Online (Sandbox Code Playgroud)

要么

mnesia:select(mytbl, [{#mytbl{name = "joe" ++ '_', _ = '_'},[],['$_']}]).
Run Code Online (Sandbox Code Playgroud)