我展示了MongoDB与SQL 2008的同事性能基准,虽然他认为MongoDB速度更快,但他并不了解它的可行性。他的逻辑是,SQL已经存在了几十年,并且有一些最聪明的人在研究它,以及MongoDB如何;一个相对较新的孩子在性能上如此优越?我无法真正提供可靠的技术答案,我希望你们能帮助他们。
答案 0 :(得分:35)
MongoDB is fast because its web scale!
它是一个有趣的视频,值得所有人观看,但它确实回答了你的问题 - 大多数像MongoDB这样的noSQL引擎都不健壮,不能应对崩溃和其他中断。这种安全性是他们为提高速度而牺牲的。
答案 1 :(得分:30)
MongoDB与传统的关系数据库不同。它是noSQL或基于文档,它提供弱一致性保证,并且它不必保证像SQL一样的一致性。
答案 2 :(得分:14)
SQL必须做很多事情,Mongo只需将位丢弃到磁盘上(差不多)
答案 3 :(得分:8)
正如已经提到的,MongoDB不是创建的,不应该像SQL数据库一样使用。 SQL(和其他关系数据库)存储关系数据,即表X中的数据可以设置为与表Y中的信息有直接关系.MongoDB没有这种能力,因此可以丢掉很多开销。因此,为什么MongoDB通常用于存储列表,而不是关系。
事实上它还没有完全符合ACID标准(尽管自从它首次推出以来它已经取得了很大的进步)并且这是速度差异的主要部分。
以下是完整交易模型与其模型之间在实际网站上列出的差异。
实际上,MongoDB的非事务性模型具有以下含义:
答案 4 :(得分:5)
虽然其他答案很有意思,但我想补充一点,MongoDB“如此之快”的原因之一,至少在基准测试中,是write concern
。
您可以阅读有关不同写入问题here的更多信息,但基本上您可以在编写数据时定义所需的“安全性”级别。
默认级别曾是 unacknowledged
,这意味着刚刚触发了写入操作,但驱动程序不会检查它是否成功执行。它更快,但不太可靠。
他们将one year ago更改为 acknowledged
。但我猜大多数基准测试仍然使用'未确认'模式以获得更好的结果。
如果你想看到性能方面的差异,你可以查看this article(有点旧,但它仍然提出了想法)。
答案 5 :(得分:3)
MongoDB很快,因为:
答案 6 :(得分:2)
我还要补充说,另一个区别在于速度更少,更多的是关于概念化(虽然我认为它可能有助于提高速度,因为加入问题的空间较小)是基于文档的存储非常类似于面向对象的心态。
基于文档可能不是完美的ACID,但我相信MongoDB更容易通过获取整个文档而不是搞乱SQL DB的所有连接而获得您想要的东西,同时冒着一些不良连接的风险。
任何SQL铁杆粉丝道歉 。
答案 7 :(得分:1)
Mongo不符合ACID标准,所以它不必处理几乎同样多的“瑕疵”,以确保您尝试放入数据库中的内容可以在以后再次出现。
如果你不介意丢失一些功能并可能丢失数据以换取速度,那么Mongo很好。如果您绝对需要保证数据完整性和/或具有复杂的连接要求,那么请避免像瘟疫这样的Mongo类型系统。
答案 8 :(得分:1)
MongoDb更快,因为: 1.没有交易; 2.表之间没有关系;
如果您尝试在SQL服务器上执行完全相同的逻辑,例如: 1.不要使用Select with locks; 2.表之间没有关系; SQL Server和MongoDB之间的速度差距不会太大。 只有一个地方肯定会更快,写和更新记录,因为SQL在队列和事务中执行插入和更新表,在MondoDB上它是异步发生的。 在我的预测中,我无法在SQL SERVER和MongoDB之间获得任何大的差异,因为两个项目之间的业务逻辑非常相似。 MongoDb的实际速度增益,您可以获得具有出价数据的分析项目,或大型内容管理引擎,如新闻纸,在线商店等。 同样,没有对MongoDB进行优化和SQL服务器上的良好优化可以使这些数据库几乎相等。
答案 9 :(得分:1)
根据MongoDB的网站,MongoDB是一个文档数据库,具有所需的可伸缩性和灵活性以及所需的查询和索引。
让我们尝试一下,这实际上意味着什么。因此,我们知道MongoDB是基于文档的,因此它将数据存储在文档中,这些文档是像JSON这样的字段值配对的数据结构。同样,它将数据存储在这些文档中,而不是像传统的关系数据库一样将数据存储在表中。因此,它是NoSQL数据库,而不是关系数据库。
此外,MongoDB具有内置的可伸缩性,当您的应用程序获得越来越多的用户并开始生成大量数据时,它很容易在多台计算机之间分布数据。因此,无论您做什么,MongoDB都会使您轻松成长。
MongoDB的另一个重要功能是它的灵活性。在用数据填充数据之前无需定义文档数据模式,这意味着每个文档可以具有不同数量和类型的字段。我们也可以随时更改这些字段。所有这些都确实符合某些实际业务情况,因此它可能会变得非常有用。
由于嵌入式数据模型,索引,分片,您相信的灵活文档,本机重复等功能,MongoDB还是一个非常高效的数据库系统。它是一个免费的开源数据库,已根据SSPL许可发布。
总而言之,我们可以说MongoDB是一个很棒的数据库系统,可以构建许多类型的现代,可伸缩和灵活的Web应用程序。实际上,Mongo可能是节点JS使用最多的数据库。
现在考虑一个博客帖子示例,让我们更深入地了解这些文档,这就是在像MySQL这样的关系数据库甚至是Excel电子表格中,完全相同的数据看起来像是一行的样子。
MongoDB使用类似于JSON的数据格式来存储称为BSON的数据。 IT看起来与JSON基本相同,但是它是类型化的,这意味着所有值都将具有数据类型,例如字符串,布尔值,日期和对象(例如Teacher Object,Double Object)等等。因此,这意味着实际上将输入所有MongoDB文档,这与JSON不同。
现在,与JSON一样,这些BSON文档也将具有字段,并且数据存储在键值对中。另一方面,在关系数据库中,每个字段都称为一列,数据库将数据以表结构排列,而我们的JSON数据则更加灵活。
例如,上图中的标签字段,实际上我们有一个数组,因此一个字段基本上有多个值,但是在关系数据库中,这是不允许的,我们不能在一个字段中有多个值。因此,我们实际上必须在关系数据库中找到解决方法,这可能会涉及更多的工作,甚至会带来更多的整体复杂性。
现在,MongoDB中另一个极其重要的功能是嵌入式文档的概念,它在关系数据库中不存在。因此,在我们的注释字段中,我们有一个包含三个对象的数组,每个文档一个。试想一下,我们有一个包含大量评论文档的评论集合,每个评论文档实际上看起来都像这样,所以有了作者和评论文本,但是我们没有这样做,而是将这些评论包含在该博客中发布文档,也就是说,我们将注释文档直接嵌入到发布文档中,这是嵌入或反规范化的过程,基本上是将一些相关数据全部包含到一个文档中。
在上面的示例中,注释与帖子相关,并且它们包含在同一文档中,这在某些情况下使数据库的性能更高,因为这样可以更轻松地一次性读取我们需要的所有数据
现在,嵌入或反规范化的反面是规范化,这就是始终在关系数据库中对数据进行建模的方式。在上述示例中,不可能将数据嵌入到关系系统中,解决方案是为注释创建一个全新的表,然后通过引用注释表的ID字段来联接这些表。
您需要了解有关BSON文档的两件事:
首先,每个文档的最大大小当前为16 MB
第二,每个文档都包含一个唯一的ID,该ID充当该文档的主键,每次有新文档时,它都会使用对象ID数据类型自动生成,您不必担心。< / p>
答案 10 :(得分:0)
Mongodb在插入和更新方面要快得多,因为它不检查架构并执行外键检查,但是在按属性读取数据和进行搜索时,它并不总是较快,特别是在没有索引键的情况下。 / p>