我正在使用mnesia开发一个新的Erlang项目。当我以前使用ets时,我可以设置针对读并发,写并发或两者优化的ets表。我最初假设我可以用mnesia表做同样的事情,但到目前为止我还没有找到如何通过浏览文档来做到这一点(这让我感到惊讶,因为mnesia基于我理解的ets / dets)。
任何人都知道这是否可行?
答案 0 :(得分:1)
来自docs:
{storage_properties,[{Backend,Properties}]。将其他属性转发到后端存储。后端当前可以是ets或dets,属性是在创建表时发送到后端存储的选项列表。属性可能不包含mnesia已使用的属性,例如type或named_table。
例如:
mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
{storage_properties,
[{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
但事实并非如此简单。 Mnesia的关键是事实上这是分布式数据库,具有复制或蠕动等功能。但这也引入了复制和开销之类的开销。修改这些可能是您优化的主要来源。这对于mnesia中的事务和脏操作等概念尤为重要。
在Ets中,所有操作都是原子操作,这或多或少都很容易实现,因为所有数据都位于一个位置(并且使写入读取优化也更容易)。在mnesia中使写入原子(确保它的正确性),您需要在可能的许多节点上创建锁。
但这并不意味着所有与mnesia表的交互都必须包含在严格的事务中。也许你有一些脏读或写。
这一切都取决于你的数据,它意味着什么,是否有任何交错,以及你将如何使用它(有多少确定性?)。所以它更多地取决于您的域名,而不是任何mnesia设置。