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

时间:2019-07-12 12:32:20

标签: erlang mnesia

我有一个mnesia表,其中包含ID,名称,城市等字段。 我想使用前缀来选择/匹配名称,例如,如果有多个名称以“ joe”开头的记录,我希望在不重复所有记录的情况下有效地选择所有记录。

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

更新

基于1000条记录的基准:

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

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

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

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

1 个答案:

答案 0 :(得分:5)

类似的东西:

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

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

(这是match specification。这两个变体是等效的,但是通常更清楚地使用ets:fun2ms来生成匹配规范。您需要-include_lib("stdlib/include/ms_transform.hrl").才能被接受请注意,如果您在外壳程序中尝试此操作,由于an inconsistency++中如何处理ets:fun2ms,因此只有后者可以工作。)

请注意,除非您的表的类型为ordered_set,并且name是主键,否则在幕后将对所有记录进行 迭代。