45

好的,还有关于为什么 MongoDB 这么快的问题

我很欣赏这些答案,但是,它们很笼统。是的,我知道:

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

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

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

谢谢

4

3 回答 3

43

首先,让我们将苹果与苹果进行比较:使用 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-Tree 路径上采用物理只读锁(相同)
  7. 服务器对行进行逻辑锁定(仅限 SQL,不是 MongoDB,不是 HandlerSocket)
  8. 服务器序列化该行并通过 TCP 发送它(相同)
  9. 客户端反序列化它(相同)

对于典型的基于 SQL 的 RDBMS,只有两个额外的步骤。这就是为什么没有真正的区别。

于 2012-06-28T12:29:11.540 回答
5

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

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

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

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

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

于 2013-03-06T09:18:02.490 回答
4

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

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

于 2012-06-28T12:33:49.673 回答