【问题标题】:Getting lots of data from Mnesia - fastest way从 Mnesia 获取大量数据 - 最快的方式
【发布时间】:2011-12-22 02:48:11
【问题描述】:

我有记录:

-record(bigdata, {mykey,some1,some2}).

正在做一个

mnesia:match_object({bigdata, mykey, some1,'_'})

获取超过 5000 行的最快方法?

澄清: 创建“自定义”键是一种选择(因此我可以进行读取),但是在单个键上进行 5000 次读取是否比 match_object 最快?

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    我很好奇您正在解决的问题、表格中有多少行等等,如果没有这些信息,这可能不是一个相关的答案,但是......

    如果你有一个包,那么最好在键上使用 read/2 然后遍历返回的记录列表。如果可能,最好对数据进行结构化以避免选择和匹配。

    通常 select/2 比 match_object 更受欢迎,因为它倾向于更好地避免全表扫描。此外,假设您不需要事务支持,dirty_select 将比 select/2 更快。而且,如果您可以忍受这些限制,Mensa 允许您直接使用底层 ets 表,这非常快,但请查看文档,因为它仅适用于非常罕见的情况。

    【讨论】:

      【解决方案2】:

      Mnesia 更像是一个键值存储系统,它会遍历它的所有记录以获取匹配。

      要快速获取,您应该设计存储结构以直接支持查询。将some1 设为键或索引。然后通过readindex_read 获取它们。

      【讨论】:

        【解决方案3】:

        Fastest Wayreturn more than 5000 rows 的声明取决于所讨论的问题。什么是数据库结构?我们想要什么 ?什么是记录结构?然后,归结为您如何编写读取函数。如果我们确定主键,那么我们使用mnesia:read/1 or mnesia:read/2,如果没有,使用Query List comprehensions更好更漂亮。它更灵活地搜索嵌套记录和复杂的条件查询。请参阅下面的用法:

        -include_lib("stdlib/include/qlc.hrl")。 -记录(大数据,{mykey,some1,some2})。 %% 查询列表理解 选择(Q)-> %% 防止嵌套事务 %% 以确保它也适用于表格 %% 是否分片,我们将使用 %% 失忆症:活动/4 案例记忆:is_transaction() 的 假-> F = fun(QH)-> qlc:e(QH) 结束, mnesia:activity(transaction,F,[Q],mnesia_frag); 真-> qlc:e(Q) 结尾。 %% 读取给定字段或什至几个 %% 你使用列表理解并通过警卫 %% 相应地过滤这些记录 read_by_field(some2,Value)-> QueryHandle = qlc:q([X || X %% 你可以传递尽可能多的保护表达式 QueryHandle = qlc:q([X || X 50 ]), 选择(查询句柄)。 %% 它可以传递一个“乐趣”,它会做 %% 查询列表理解中的记录选择 auto_reader(ValidatorFun)-> QueryHandle = qlc:q([X || X F = fun({bigdata,SomeKey,_,Some2}) -> true; (_) -> 错误 结尾, 自动阅读器(F)。

        所以我认为如果你想要最快的方式,我们需要更多的澄清和问题细节。亲爱的,速度取决于很多因素!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多