为什么MongoDB如此之快

时间:2011-03-03 21:21:47

标签: mongodb

我展示了MongoDB与SQL 2008的同事性能基准,虽然他认为MongoDB速度更快,但他并不了解它的可行性。他的逻辑是,SQL已经存在了几十年,并且有一些最聪明的人在研究它,以及MongoDB如何;一个相对较新的孩子在性能上如此优越?我无法真正提供可靠的技术答案,我希望你们能帮助他们。

11 个答案:

答案 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的非事务性模型具有以下含义:

  • 无回滚。您的代码必须在没有回滚的情况下运行。在执行第一个数据库之前检查所有编程条件 写操作。订购你的写操作最多 重要的操作最后发生。
  • 显式锁定。您的代码可能在执行操作时显式锁定对象。因此,应用程序员有 能够在需要时确保“可串行化”。锁定 功能将在晚期alpha /早期beta版本中提供 MongoDB的。
  • 启动时检查数据库。如果数据库异常终止(罕见),数据库检查过程将在启动时自动运行 (类似于fschk)。

答案 4 :(得分:5)

虽然其他答案很有意思,但我想补充一点,MongoDB“如此之快”的原因之一,至少在基准测试中,是write concern

您可以阅读有关不同写入问题here的更多信息,但基本上您可以在编写数据时定义所需的“安全性”级别。

默认级别曾是 unacknowledged ,这意味着刚刚触发了写入操作,但驱动程序不会检查它是否成功执行。它更快,但不太可靠。

他们将one year ago更改为 acknowledged 。但我猜大多数基准测试仍然使用'未确认'模式以获得更好的结果。

如果你想看到性能方面的差异,你可以查看this article(有点旧,但它仍然提出了想法)。

答案 5 :(得分:3)

MongoDB很快,因为:

  1. 不是ACID,可用性优先于一致性。
  2. 异步插入和更新:这意味着一旦处理插入查询,MongoDB就不会向DB插入数据。更新也是如此。
  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电子表格中,完全相同的数据看起来像是一行的样子。

enter image description here

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>

此处有更多相关信息:https://www.youtube.com/watch?v=K8xsuFgCRkU