我有一个含ID,名称,城市等字段的mnesia表...我想使用前缀选择/匹配名称,例如,如果有多个名称以“ joe”开头的记录,我想高效地选择所有记录无需重复所有记录。
就像sql查询“从mytbl中选择id,其中的名字像joe%”一样。谢谢
更新:
基于1000条记录的基准:
MySql(名称也是主键):450-500微秒
Mnesia实际表格(非关键):300-370微秒
以名称为键的单独的ordered_set失忆表:60-108微秒
注意: mnesia表仅是ram,即使在为实际表命名字段之后,我也没有注意到任何性能差异。
就像是:
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)