与 MySQL 相比,MongoDB 慢得多 - 基本的 find() 方法

Posted

技术标签:

【中文标题】与 MySQL 相比,MongoDB 慢得多 - 基本的 find() 方法【英文标题】:MongoDB is much slower in comparision to MySQL - basic find() method 【发布时间】:2015-07-22 10:38:43 【问题描述】:

这是我的第一个 *** 问题,但我是老读者了。

我正在做一些家庭项目,我试图比较 MongoDB 和 mysql 的速度。令人惊讶的是.. 即使使用非常基本的表,MongoDB 的速度也几乎慢了 5 倍?我读到它们的速度几乎相同,但这让我开始思考。

谁能解释一下为什么会这样?

MongoDB 代码:

app.get('/mongodb', function(req, res, next) 
  var time = process.hrtime();
  User.find(function(err, users) 
    if (err) return next(err);
    var diff = process.hrtime(time);
    if(diff[0] == 0) 
      res.send(diff[1].toString());
     else 
      res.send(diff[0]+"."+diff[1]);
    
  );
);

MySQL 代码:

app.get('/mysql', function(req, res, next) 
  var time = process.hrtime();
  mysql.query("SELECT * FROM users", function(err, results) 
    if (err) throw err;
    var diff = process.hrtime(time);
    if(diff[0] == 0) 
      res.send(diff[1].toString());
     else 
      res.send(diff[0]+"."+diff[1]);
    
  );
);

MySQL 返回:1.52201348

MongoDB 返回:9.746405351

架构是:

User 
  id integer,
  name string,
  email string,

大约有 50 万用户。

索引在 MongoDB 中的 _id 和 MySQL 中的 id 上。

MongoDB shell 版本:2.4.6

MySQL 版本:5.5.37

有什么想法吗?任何帮助或建议将不胜感激。

问候, Wnzl.

【问题讨论】:

MongoDB 并不是为了提高性能而撒在 Web 应用上的魔法粉。 此外,基准测试很难...有十几个问题要问(例如,是否访问了所有数据?如何访问?批量大小是多少?这是一个现实的用例吗?)。此外,mysql 是否返回字符串或者这些 JSON 对象已经存在?在现实情况下,这是否提供了任何有效的比较?毕竟,数据模型应该是完全不同的。由于所有这些问题,我认为这“过于宽泛”。 你好。我没有说这很容易,我知道这很难,这就是为什么我停在简单的“SELECT *”上。我也很清楚 MySQL 的工作与 Mongo 不同。但我想比较最简单的情况。至少回答你的几个问题:1)你能解释一下批量大小以及如何测量它吗?我已经运行了默认的 Mongo 和 Mysql。 2)是的,这是现实的用例。我想选择所有用户(可能限制他们 50000)并处理我得到的数据。 3) MySQL 返回 json 以及 Mongo。 4) 设置为 Digital Ocean 4GB 内存,4 cpu 设置。 5) 数据是一样的。 每个存储解决方案的核心都是一样的,无论是关系数据库还是像 Mongo 这样的“NoSQL”——它们访问文件所在的磁盘。现在,NoSQL 的有趣之处在于它们根本不尝试优化写入过程,因为它们让 OS / HDD 控制器来处理。另一方面,MySQL 实现了许多优化,从在同一磁盘扇区上写入到单个 I/O 中的最佳刷新等。所以一个问题是如何检索数据,另一个问题是如何它已发送。您需要同时测量两者。 让我们做一些数学运算:我们有 500k 个文档所有必须从磁盘 complety 读取,因为 MongoDB 本身什么都不知道 i> 的固定模式。这是 0.00001949 和每个文档的几秒,如果我没记错的话,是 19.49 微秒。尝试以该平均值从磁盘读取 500k JSON 文件。 【参考方案1】:

我认为这里的主要问题是应该始终针对特殊用例进行基准测试。 假设它们以相同的速度执行是非常不具体的。

因此,您在此处检查的用例由您的示例定义,意味着获取模式的所有实体。即使用例非常简单,结果的意义也不大。

MongoDB 和 SQL 是为不同用例设计的数据库系统。这意味着每个系统都针对不同的查询进行了优化。这就是我认为你应该更深入地挖掘不同表现的原因。

还要考虑到,基于帽子,查询一个模式的所有实体,也许可以通过多个但总体上更快的查询来实现。最后想想引导、缓存和索引机制,由于对系统特定用例的优化,它们可能完全不同。

【讨论】:

以上是关于与 MySQL 相比,MongoDB 慢得多 - 基本的 find() 方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多

为什么是HashSet 比HashSet慢得多 ?

MySQL 查询调优 - 为啥使用变量中的值比使用文字慢得多?

MySQL 对多个 OR 使用索引,但对 IN 没有索引,而且速度慢得多

为啥子查询中的 OR 会使查询慢得多?

Visual Studio 2012 与 Visual Studio 2005 中的小程序慢得多