ets:select与mnesia:select,哪个更好?在插入和删除时,应该使用这两者中的哪一个?我正在使用ejabberd,请给予一些指导?
tl;dr
ETS是一个快速的键/值存储,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段,以高级别地讨论状态表示的架构问题。