我正在使用 mnesia 开发一个新的 Erlang 项目。当我以前使用 ets 时,我可以设置针对读取并发性、写入并发性或两者进行优化的 ets 表。我最初以为我可以用 mnesia 表做同样的事情,但到目前为止我还没有找到如何通过查看文档来做到这一点(这让我感到惊讶,因为根据我的理解,mnesia 是基于 ets/dets 的)。
有人知道这是否可行吗?
最佳答案
来自文档:
{storage_properties, [{Backend, Properties}]. Forwards additional properties to the backend storage. Backend can currently be ets or dets and Properties is a list of options sent to the backend storage during table creation. Properties may not contain properties already used by mnesia such as type or named_table.
For example:
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 设置。
关于optimization - Erlang:优化 mnesia 表的读/写并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023815/