ets:select vs mnesia:select 哪个更好用。并且在插入和删除的情况下,我们应该使用这两个中的一个。我正在研究ejabberd.Any指针?
答案 0 :(得分:14)
<强> TL;博士强>
它们是为不同目的而构建的工具:ETS是一个快速的K / V存储,Mnesia是在它们之上构建的数据库。使用适合您用例的工具。
<强>讨论强>
Mnesia建立在ETS / DETS之上。哪个更有效可归结为您正在寻找的功能。如果你有简单的表没有额外的逻辑,只有一个简单的索引,只能在内存或磁盘中使用表,那么ETS和Mnesia之间没有区别,你不会使用任何Mnesia特征
另一方面,如果您需要多个数据索引,想要实现一些缓存行为,需要磁盘持久性但缓存索引性能,以及您期望从数据库系统中获得的其他东西,那么您要么必须在ETS / DETS之上自己实现Mnesia类型的功能,要么只使用Mnesia。
我经常在原型设计时(甚至是生产中的早期版本的功能)开始使用一些ETS表,然后开始查找我需要数据序列化并在磁盘上的位置,然后意识到我需要多个索引等等。无论如何,将最初在ETS中的大量数据管理内容移动到Mnesia中。如果您正确地抽象出数据访问的概念,那么以任何方式更改系统的这一部分的实现都不是问题。但是,如果你有分散在整个模块中的选择调用,那么你可能还有其他架构问题要比ETS和Mnesia重要得多。
无论您使用什么,请确保您没有像整个系统的所有状态的中央存储库一样创建系统范围的瓶颈。这是一个错误,我看到很多人来自(C / Python / $ imperative_lang + Postgres / MariaDB / $ rbdms)背景制作。
阅读ErlMUD Commentary: Architecture, Locations的第2-6段,了解关于状态表示的建筑讨论。