为什么MongoDB比SQL DB快得多的详细和具体原因?

时间:2012-06-28 12:21:59

标签: sql mongodb performance nosql

好的,有关Why Is MongoDB So Fast

的问题

我很欣赏这些答案,但是,它们非常普遍。是的,我知道:

  • MongoDB是基于文档的,那么为什么基于文档可以导致 更高的速度?
  • MongoDB是noSQL,但为什么noSQL意味着更高的性能?
  • SQL比MongoDB在一致性,ACID等方面做得更多,但我相信MongoDB也在做类似的事情,以保证数据安全,维护索引等,对吧?

好的,我写这个问题只是为了找出

  1. MongoDB的高性能有哪些详细和具体的原因
  2. 完全 SQL是什么,但是MongoDB没有,所以它获得了非常高的性能?
  3. 如果面试官(MongoDB和SQL专家)问你"Why MongoDB is so fast",你会怎么回答?显然只是回答:"because MongoDB is noSQL"是不够的。
  4. 由于

3 个答案:

答案 0 :(得分:33)

首先,让我们将苹果与苹果进行比较:使用MongoDB进行读取和写入就像在RDBMS中没有非聚集索引的表上通过主键进行单次读取和写入一样。

因此,请准确指出:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html

事实证明,对完全相同的原始操作进行公平比较的速度差异并不大。 事实上,MySQL稍快一点。我会说,它们是等价的。

为什么呢?实际上,两个系统在这个特定的基准测试中都做了类似的事情。返回通过主键搜索的单行实际上没那么多工作。这是一个非常快速的操作。我怀疑跨进程通信开销是其中很重要的一部分。

我的猜测是,MySQL中调优的代码越多,MongoDB的系统开销就越小(没有逻辑锁,也可能是其他一些小东西)。

这会得出一个有趣的结论:您可以像使用文档数据库一样使用MySQL,并从中获得出色的性能。


如果采访者说:“我们不关心文档或样式,我们只需要更快的数据库,您认为我们应该使用MySQL还是MongoDB?”,我会回答什么?

我建议暂时忽略性能并查看两个系统的相对强度。 MongoDB会想到缩放(向上)和复制等事情。对于MySQL,还有更多的功能,如富查询,并发模型,更好的工具和成熟度等等。

基本上,您可以交换功能以提高性能。愿意这样做吗?这是一个不能普遍做出的选择。如果您不惜任何代价选择性能,请考虑在添加其他技术之前先调优MySQL。


以下是客户端按主键检索单行/文档时发生的情况。我将注释两个系统之间的差异:

  1. 客户端构建二进制命令(相同)
  2. 客户端通过TCP(相同)发送它
  3. 服务器解析命令(相同)
  4. 服务器从缓存访问查询计划(仅限SQL,而不是MongoDB,而不是HandlerSocket)
  5. 服务器要求B-Tree组件访问行(相同)
  6. 服务器在通向行(相同)的B树路径上进行物理只读锁定
  7. 服务器对该行进行逻辑锁定(仅限SQL,而不是MongoDB,而不是HandlerSocket)
  8. 服务器序列化行并通过TCP(相同)发送它
  9. 客户端反序列化(相同)
  10. 典型的基于SQL的RDBMS只有两个额外的步骤。 这就是为什么没有真正的差异。

答案 1 :(得分:5)

通常,MySQL和MongoDB在单个机器上的“持久”写入性能非常相似。简单的键/值查找几乎相同......如果你想以这种方式使用MySQL。显然,文档支持是一项巨大的生产力优势,也是业绩的重大胜利。

使用自动分片... MongoDB以难以描述的方式更快。开箱即用,通过适当的设计,您几乎可以线性扩展,而无需在代码中构建任何逻辑。

几乎每个驱动程序都内置了读/写拆分...大多数都是由10gen自己赞助或开发的。

我之前扩展了应用程序并编写了读/写拆分代码,分布式散列用于分片,重新平衡连续运行的作业,并将gzip添加到mysql“document”存储中。啊。

它更快,因为它简单而专注。它的设计考虑了所有这些因素。在商品硬件上扩展是一个优先事项。 RDBMS的优先级完全不同。

答案 2 :(得分:4)

默认情况下,mongo不进行任何索引;也没有交易。但是,如果将mysql表配置为无索引,并打开自动提交,则不会看到巨大的速度差异。将位写入磁盘只需要一定的时间。

但是,mongo的设计很容易扩展。使用分片,您可以水平扩展写入并获得更好的性能,而无需主 - 主复制的复杂性。使用副本集,您可以水平扩展读取。所以,我会说系统性能有所改善,但每个查询都不一定更快。