【发布时间】:2015-07-22 10:38:43
【问题描述】:
这是我的第一个 Stackoverflow 问题,但我是老读者了。
我正在做一些家庭项目,我试图比较 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 文件。