Mnesia与碎片表分页

时间:2015-06-10 22:36:37

标签: pagination erlang mnesia

我有一个配置如下的mnesia表:

-record(space, {id, t, s, a, l}).

mnesia:create_table(space, [ {disc_only_copies, nodes()},
                                                {frag_properties, [ {n_fragments, 400}, {n_disc_copies, 1}]},
                                                {attributes, record_info(fields, space)}]),

我在这张桌子上至少有400万条用于测试目的的记录。

我已经实现了类似Pagination search in Erlang Mnesia

的内容
fetch_paged() ->
   MatchSpec = {'_',[],['$_']},
   {Record, Continuation} = mnesia:activity(async_dirty, fun mnesia:select/4, [space, [MatchSpec], 10000, read], mnesia_frag).

next_page(Cont) ->
   mnesia:activity(async_dirty, fun() -> mnesia:select(Cont) end, mnesia_frag).

当我执行分页方法时,它会带来3000到8000之间的批量,但永远不会超过10000.

我必须做些什么才能使我的产品始终如一?

1 个答案:

答案 0 :(得分:1)

问题是你期望mnesia:select / 4,记录为:

select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'

获取NObjects限制,在示例10,000中为NObject。

但同样的文件也说:

For efficiency the NObjects is a recommendation only and the result may contain anything from an empty list to all available results. 

这就是你没有获得10,000个记录的一致批次的原因,因为NObject不是限制,而是推荐批量大小。

如果你想获得你的10,000条记录,你就没有别的选择来编写自己的函数,但是select / 4是以这种方式编写的,用于优化目的,所以很可能你将编写的代码将会比原始代码慢。

顺便说一句,您可以在https://github.com/erlang/otp/tree/master/lib/mnesia/src

上找到mnesia源代码