Mnesia 分页 table

Mnesia pagination with fragmented table

我有一个失忆症 table 配置如下:

-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 万条记录用于测试 table。

我已经实现了这样的东西

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。

我需要做什么才能始终如一地为我带来批次?

问题是您期望失忆症:select/4,记录为:

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

让您达到 NObjects 限制,在您的示例中为 NObjects 10,000。

但是同一份文档还说:

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

这就是您无法获得 10,000 条记录的一致批次的原因,因为 NObjects 不是限制而是建议的批次大小。

如果你想获得 10,000 条记录,除了编写你自己的函数之外没有其他选择,但是 select/4 以这种方式编写是为了优化目的,所以很可能你将使用的代码写出来会比原来的代码慢

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

上找到 mnesia 源代码