与主要的SQL数据库实现相比,Mnesia有何优势?与它们的区别是什么? >

评论

我认为这个问题需要更多关注。您能否列出用来判断与其他数据库实现的优缺点的标准?这似乎确实是Wikipedia文章/列表的候选人,但实际上并不是可以在此处回答的内容。此外,考虑到Mnesia确实更类似于CouchDB,因此不问它与“主要” SQL实现的比较方式而没有命名要与之比较的情况是不公平的。与SQLServer或Oracle相比,它甚至还没有达到逐节点性能。

#1 楼

很抱歉参加晚会。 :)
这是我的答案,基于1996年以来一直使用Mnesia和1988年以来一直使用其他各种数据库技术。

Mnesia和MySQL的确是不同的野兽,哪一个是最好的取决于有关打算如何使用它的信息。

如果应用程序是用Erlang编写的,则Mnesia允许您将数据存储在与应用程序相同的内存空间中,这意味着您可以按快到几微秒。在MySQL中这是不可能的,因为您的应用程序和数据库将在内存中分开。 Mnesia之所以能够做到这一点并且仍然很健壮,是因为Erlang在语言级别上实现了内存“保护”。 ,Mnesia + Erlang通常都很出色。您需要确定哪个对您最重要。就像在上面的文档中说的那样,Mnesia的目标应用是电信交换应用,其中响应时间要求例如通话建立时间约为20毫秒。从本质上讲,这意味着您仅可以在数据位于共享内存中的情况下从数据库中读取数据,但可以避免在每次调用设置的基础上写入持久性存储。 OTOH,这些应用程序实际上不需要临时查询支持,并且不使用非常大的数据集。已经进行了一些工作来扩展Mnesia在其他领域的适用性,但是对于Erlang / OTP开发团队而言,这并不是优先事项。 Mnesia就是这样,并且可能会保持这种状态。

在上面比较Mnesia和MySQL速度的链接中,需要记住它在eJabberd中,如果是MySQL,它可以在单个服务器上运行,如果是Mnesia,则可以在一个完全复制的数据库上运行-大型eJabberd集群可以拥有多达10个或更多的erlang节点(因此,有10个或更多的Mnesia副本)。从冗余的角度来看,这是相当荒谬且昂贵的,Mnesia绝不强迫您这样做。显然,它可以在每个节点上提供快速读取,但是写入将非常昂贵。我已经阅读了几次比较,最终将分布式Mnesia与单节点MySQL进行了比较。如果MySQL不需要冗余,那么Mnesia也不需要冗余。 Mnesia在选择复制模式方面非常灵活,并且数据位置对于应用程序是透明的。

Mnesia也不限于每个表2 GB(尽管有特定的存储选项)。我知道的最大的Mnesia数据库在(64位)RAM +磁盘中大约有600 GB的数据-尽管我不建议这样做。最高10-20 GB的存储空间对于现代硬件来说应该是完全可以的,但是请完全跳过disc_only_copies并使用disc_copies-如果需要,请购买更多的RAM。在使用分片支持(mnesia_frag)之前,我会三思而后行-它可以工作,但很少值得为此烦恼。

也许Mnesia和MySQL之间的最大区别在于SQL本身:Mnesia确实没有可比的功能; QLC为即席查询提供了一些支持,但是它与SQL不在同一个联盟中,查询优化的级别也没有。在工具和配置方面,MySQL也很出色,如果您需要分析,那么毫无疑问应该选择哪一个(即,不是Mnesia)。

查看Mnesia的最佳方法是对Erlang语言的扩展。它使数据触手可及,非常适合数据结构和访问模式众所周知的小型数据集。为此,在MySQL最有效的地方使用MySQL就像在Mnesia上一样不舒服。

大多数应用程序介于两者之间,这成为判断的地方。您可能最终会同时使用...

评论


感谢你的回答。这是我读过的关于失忆症的最好解释。

–Akshat Jiwan Sharma
2014年1月21日在16:59

感谢您与我们分享您的经验,它比阅读任何博客都有价值。

–拉胡尔·高塔姆(Rahul Gautam)
2014年5月21日10:41

很好的答案,但我现在更加困惑。

–HIRA THAKUR
14-10-21在6:50

非常彻底的答案。因此,如果我对Mnesia的理解正确,那么对于内存中的某些键/值存储(而不是Memcached或Redis或类似的解决方案)而言,它是完美的选择,您只需要速度,而无需分析或持久的“ SQL可查询”存储?对于其他所有事情,我最好使用MariaDB / Postgres或Mongo / Cassandra / RIAK之类的东西?澄清一下-我正在学习Elixir,不是真正的Erlang(来自Ruby / Perl背景),并试图找出最佳的堆栈,让我用MariaDB和Redis替换Rails / Sinatra

– konung
16年6月15日在16:24



#2 楼

根据文档:

Mnesia是一种分布式数据库管理系统,适用于需要连续操作和软实时属性的电信应用程序和其他Erlang应用程序。它是开放电信平台(OTP)的一部分,该平台是用于建筑电信应用的控制系统平台。
特别是许多不间断系统要求很高的容错能力,同时还要求DBMS在与应用程序相同的地址空间中运行,导致我们实现了全新的DBMS。叫做Mnesia。 Mnesia在编程语言Erlang中实现并与之紧密相连,它提供了实现容错电信系统所必需的功能。 Mnesia是一种多用户分布式DBMS,专门为以符号编程语言Erlang(也是目标语言)编写的工业电信应用程序而设计。 Mnesia试图解决典型电信系统所需的所有数据管理问题,并且具有许多传统数据库中通常不具备的功能。
在电信应用中,与传统DBMS提供的功能有不同的需求。现在以Erlang语言实现的应用程序需要多种功能的混合,而传统DBMS通常无法满足这些功能。 Mnesia在设计时考虑了以下要求:
快速实时键/值查找
复杂的非实时查询,主要用于操作和维护
由于分布式应用程序而导致的分布式数据
/>高容错
动态重新配置
复杂对象
Mnesia与大多数其他DBMS的不同之处在于,它的设计考虑了电信应用程序的典型数据管理问题。因此,Mnesia将传统数据库中的许多概念(例如事务和查询)与电信应用程序数据管理系统中的概念相结合,例如非常快速的实时操作,可配置的容错度(通过复制)以及重新配置系统,而无需停止或挂起它。 Mnesia也很有趣,因为它与编程语言Erlang紧密耦合,从而几乎将Erlang变成了数据库编程语言。这有很多好处,最重要的是,DBMS使用的数据格式与用于处理数据的编程语言使用的数据格式之间的阻抗失配完全消失了。

Mnesia vs MySQL ,性能:使用某些* SQL数据库时,与使用内部Mnesia相比,ejabberd消耗的计算资源更少。当您有多个并发用户(例如,超过1000个)时,您可能对该主题感兴趣。在很少有并发用户的情况下,ejabberd的CPU消耗可以忽略不计,因此小型服务器的管理员不必在意设置外部SQL服务器和数据库。

CouchDB诉Mnesia,V.MySQL和其他Mnesia主题:

立即想到的一个见解是,虽然我对如何为MySQL构造数据一目了然,但对Mnesia和CouchDB而言却并非如此,我仍然不确定是否最好然而。现在,这里有几个比较明显的要点:
一条“记录”具有一个“数字播放”字段,该字段显然表明已播放了多少次。在MySQL中,这很好,但是如果我将此字段合并到CouchDB的文档中,则每次该数字更改时,我都会在数据库中获得该文档的完整重复版本,这似乎效率很低。
这三个-记录,标签以及它们之间的链接表(至少不清楚,请参见脚本)在MySQL中的表格布局显然是(至少对我来说)正确的解决方案,但是在Mnesia中都有许多可行的方法和CouchDB,我发现我没有直觉上的答案。

简而言之,它是针对非常特定的目的而设计的,并且似乎经过精心设计以适合该目的。没有一个数据库可以与另一个数据库进行抽象比较。只有通过使用需求,才能引起可相称性的要素。

#3 楼

不,我不会说Mnesia适合处理大量数据。您可以选择使用Ets或Dets作为后端。如果选择“ Ets”,则数据库将仅处于内存中并且速度非常快,但数据不是持久性的。而且,如果您要持久存储数据(保存在磁盘上),则需要使用Dets,它的最大存储量为2GB,因此数据库最多可以容纳2GB的数据。

您可以使用自定义后端Riak NoSQL数据库中使用的innostore。

Mnesia的优点是它是一个分布式数据库,因此如果您拥有多台计算机,则很容易执行容错系统。而且它在Erlang中非常容易使用,因为它是一个语言内数据库,并且行为“像一个函数”。如果您只需要一个内存数据库,它也非常快。就像缓存一样。