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