[erlang-questions] Efficient way to store message lists in mnesia

Khitai Pang <>
Fri Jun 3 19:08:46 CEST 2016


Hi,

I need to store a list of unread messages for every user id.  The order 
of the messages needs to be preserved.  Currently I store the messages 
in a list as the value of the user id key in a table of type set:

{user_id, [message]}

The table is a disc_copies table.

Whenever someone sends a message to a user, the message is prepended to 
the head of the message list of the user.

Now my concern is, adding a new message to the list requires reading and 
writing the whole list, which can be pretty slow if the list is very 
long, i.e. thousands of messages.

There is another way to do this, which uses a table of type bag and 
composite keys:

{user_id, timestamp1, message1}
{user_id, timestamp2, message2}
{user_id, timestamp3, message3}
...

But I don't think this is any better because I heard that mnesia bag 
tables performance is very bad: 
http://erlang.org/pipermail/erlang-questions/2011-March/057044.html

Are there other ways to store lists of messages in mnesia where 
reading/updating the message lists can be very efficient?


-Khitai


More information about the erlang-questions mailing list