<div dir="ltr">Until the optimisations mentioned by Mikael are implemented, you can reach good performance by writing the loop manually:<div><br></div><div><font face="monospace"><span style="color:rgb(33,33,33)">loop(mnesia:next(table, #key{jid={<<"u</span><span style="color:rgb(33,33,33)">ser1">>, <<"localhost">>}, timestamp = </span><span style="color:rgb(33,33,33)">{1,2,3}}), []).</span><br></font></div><div><span style="color:rgb(33,33,33)"><font face="monospace"><br></font></span></div><div><span style="font-family:monospace;color:rgb(33,33,33)">loop(K = #key{jid</span><span style="font-family:monospace;color:rgb(33,33,33)">={<<"u</span><span style="font-family:monospace;color:rgb(33,33,33)">ser1">>, <<"localhost">>}}, Acc) -></span><br></div><div><span style="color:rgb(33,33,33)"><font face="monospace">  loop(mnesia:next(table, K), mnesia:read(table, K) ++ Acc);</font></span></div><div><span style="color:rgb(33,33,33)"><font face="monospace">loop(_, Acc) -> Acc.</font></span></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 22 Jan 2019 at 13:41 Mikael Pettersson <<a href="mailto:mikpelinux@gmail.com">mikpelinux@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Jan 22, 2019 at 11:32 AM Matthias Rieber <<a href="mailto:ml-erlang@zu-con.org" target="_blank">ml-erlang@zu-con.org</a>> wrote:<br>
><br>
> Hello,<br>
><br>
> I've a question regarding the prefix keys in mnesia_eleveldb. I have a<br>
> record like this:<br>
><br>
> -record(key, {<br>
>   jid       :: { binary(), binary() },<br>
>   timestamp :: erlang:timestamp()<br>
> }).<br>
><br>
> -record(table, {<br>
>   key = key{},<br>
>   payload :: term()<br>
> }).<br>
><br>
><br>
> As far as I understand these queries are fast:<br>
><br>
> mnesia:match_object(<br>
>   #table{key=#key{jid={<<"user1">>, <<"localhost">>},<br>
>                   timestamp = '_'},<br>
>          payload='_'})<br>
><br>
> Since the keys are ordered I expected that query to be fast:<br>
><br>
> mnesia:select(table, ets:fun2ms(<br>
>  fun(#table{key=#key{jid={<<"user1">>, <<"localhost">>},<br>
>                      timestamp = Timstamp},<br>
>             payload=P}) when Timstamp > {1,2,3} -> P<br>
>  end)<br>
><br>
> But performance tests show that this will read all records (probably only<br>
> the ones with the matching jid). Is it possible to select this in an<br>
> efficient manner?<br>
<br>
Your observations are correct.  The second case is a "range select"<br>
which LevelDB can support efficiently, but mnesia_eleveldb doesn't<br>
implement that optimization yet.  I've had a ticket to implement this<br>
for a while now, but the initial prototype didn't work and I haven't<br>
had time to up-prioritize it yet.<br>
<br>
Meanwhile we've implemented another optimization in mnesia_eleveldb:<br>
we no longer store the tags of records in mnesia_eleveldb tables as<br>
those tags are invariant and redundant.  This reduces I/O and CPU<br>
usage.<br>
<br>
/Mikael<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div></div>