【问题标题】:MongoDB not that faster than MySQL?MongoDB 不比 MySQL 快吗?
【发布时间】:2011-09-21 14:00:53
【问题描述】:

几个月前我发现了mongodb,看了post之后,我觉得mongodb真的比mysql快,所以我决定自己建个bench,问题是我没有和上面一样的结果帖子的作者,尤其是查询数据库:mongodb 似乎比 MyISAM 表慢。你能看看我的python代码吗,可能有问题:

from datetime import datetime
import random
import MySQLdb
import pymongo

mysql_db=MySQLdb.connect(user="me",passwd="mypasswd",db="test_kv")
c=mysql_db.cursor()

connection = pymongo.Connection()
mongo_db = connection.test
kvtab = mongo_db.kvtab

nb=1000000
thelist=[]
for i in xrange(nb):
    thelist.append((str(random.random()),str(random.random())))
t1=datetime.now()

for k,v in thelist:
    c.execute("INSERT INTO key_val_tab (k,v) VALUES ('" + k + "','" + v + "')")

dt=datetime.now() - t1
print 'MySQL insert elapse :',dt

t1=datetime.now()
for i in xrange(nb):
    c.execute("select * FROM key_val_tab WHERE k='" + random.choice(thelist)[0] + "'")
    result=c.fetchone()

dt=datetime.now() - t1
print 'MySQL select elapse :',dt


t1=datetime.now()

for k,v in thelist:
    kvtab.insert({"key":k,"value":v})

dt=datetime.now() - t1
print 'Mongodb insert elapse :',dt
kvtab.ensure_index('key')
t1=datetime.now()
for i in xrange(nb):
    result=kvtab.find_one({"key":random.choice(thelist)[0]})

dt=datetime.now() - t1
print 'Mongodb select elapse :',dt

注意事项:

  • MySQL 和 mongodb 都在 locahost 上。
  • MySQL 和 mongodb 都有索引的 'key' 列

MySQL 表:

CREATE TABLE IF NOT EXISTS `key_val_tab` (
  `k` varchar(24) NOT NULL,
  `v` varchar(24) NOT NULL,
  KEY `kindex` (`k`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

版本是:

  • MySQL:5.1.41
  • mongodb : 1.8.3
  • 蟒蛇:2.6.5
  • pymongo:2.0.1
  • Linux : Ubuntu 2.6.32 32Bits with PAE
  • 硬件:桌面核心 i7 2.93 Ghz

结果(100 万次插入/选择):

MySQL insert elapse : 0:02:52.143803
MySQL select elapse : 0:04:43.675914
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was the opposite)

【问题讨论】:

  • 一方面,MongoDB 喜欢 64 位架构。我不会在一个对其中一个系统进行基准测试的经验不是很丰富的人运行的基准测试中投入太多。
  • @ceejayoz 如果你必须非常有经验才能让它快速运行,那么对于大多数用户来说它会很慢。我想说由没有经验的用户制定的基准可能同样有用......
  • 我不确定 mongodb(和其他 nosql 数据库)的终极目标是否比 sql 服务器更快,尤其是在单服务器场景中。大多数 nosql dbs 都是为垂直扩展而构建的,当您需要将数据分区到 10 个 SQL dbs 与 10 个 nosql dbs 时,您可能会看到更大的改进
  • 您是否进行了分析以了解所有时间都花在了哪里? kvtab.find_one 真的是慢点吗?或者这是在浪费时间创建 Python dict 对象?做kvtab.find_one的时候用吗?数据库基准的问题在于,您可能正在衡量基准本身的低效率。
  • @Ivar Bonsaksen 如果您有使用 MySQL 但没有使用 MongoDB 的经验,那么期望 MySQL 有更好的机会做好。如果不学习如何优化它,您就无法在生产中使用新技术。

标签: python mysql mongodb


【解决方案1】:

叹息。这种基准,我在这种情况下松散地使用这个术语,通常从一开始就崩溃了。 MySQL 不是比 MongoDB 更“慢”的数据库。一个是关系数据库,另一个是 NoSQL 文档存储。他们将/应该在他们设计覆盖的功能领域更快。在 MySQL(或任何 RDBMS)和 MongoDB 的情况下,这种重叠并不像很多人想象的那么大。这与您在 Redis 与 MongoDB 的讨论中得到的苹果和橘子的比较是相同的。

有太多变量(应用程序功能要求、硬件资源、并发性、配置、可扩展性等)需要考虑,任何以“MongoDB 比 MySQL 更快”结尾或反之亦然的基准测试或文章都将结果推广到无用点。

如果您想进行基准测试,请先定义一组严格的功能需求和业务规则,然后在两种持久性解决方案上尽可能高效地实施它们。结果将是一个比另一个更快,并且在几乎所有情况下,更快的方法都有一些相关的缺点,根据要求可能仍然使较慢的解决方案更可行。

所有这些都忽略了上面的基准测试并没有模拟任何类型的现实世界场景。不会有很多应用程序在没有任何类型的线程/并发的情况下进行最大吞吐量插入(这会显着影响大多数存储解决方案的性能)。

最后,像这样比较插入也有点不妥。 MongoDB 可以通过火和忘记批量插入实现惊人的插入吞吐量,或者可以通过 fsynced 复制写入慢几个数量级。这里的问题是 MongoDB 为您提供了 MySQL 没有(或更少)的选择。所以这里的比较只对允许触发和忘记类型写入的业务需求有意义(归结为,“我希望它有效,但如果没有,也没什么大不了”)

TL;DR 停止进行简单的吞吐量基准测试。它们几乎总是没用的。

【讨论】:

  • +1 是一个很好的答案,我只想补充一点,MySQL 提供了过多的存储引擎——其中之一是 TokuDB,它使用分形树来实现出色的插入速度。
  • 为了全面披露,我想在这里补充一点,我是 MongoDB 的忠实粉丝。但这并不是万能的数据库子弹,10gen 也没有声称它是。
  • 我完全同意你的观点,但是通常是缺乏知识决定了某个软件的受欢迎程度。有人读到 MongoDB [插入 QPS 的数量] 比 [插入与 MongoDB 完全无关的功能] 并且突然间互联网被“X 优于 Y”污染,由没有实际工作经验的人进行基准测试。适合工作的正确工具应该是任何程序员的口头禅。
  • 好吧,我的问题的目的不是要证明 mongodb 在如此快速的单一测试中并没有那么快。但是要理解为什么我对 mongo 的“选择”运行时间比我在问题开头给出链接的帖子慢 20 倍:作者像我一样使用 python,并且搜索速度比我快得多,那为什么?
  • (更好的)索引、正确的平衡、更快的磁盘 i/o、更多的内存、数据基数等
【解决方案2】:
MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert

mongodb 插入速度更快,因为 mongodb 将所有数据插入 ram,然后定期将数据刷新到磁盘。

MySQL select elapse : 0:04:43.675914
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was

当您嵌入/非规范化数据时,您可以使用 mongodb 获得最佳性能。在许多情况下,由于嵌入/非规范化,mongodb 允许我们避免连接。

当您只是将数据插入到一个集合/表中并通过索引 mongodb 读回不应该更快时,如果与 sql 数据库相比,读取速度应该是相同的。

顺便说一句:在 mongodb 2.0 indexes 中快 25%,所以我猜 2.0 会比 mysql 更快。

【讨论】:

  • 插入速度更快,因为它没有 MySQL 所做的事情。 safe=true 插入有点慢(通常比 MySQL 快一点),复制写入或 fsync 写入仍然更慢。重点是,像这样的比较是有问题的。他们做的事情截然不同。
  • 我同意你的观点,但我不是在比较,我只是说为什么在他的基准测试中 mongodb 更快。因为默认情况下 safe=false 并且它意味着每分钟刷新一次。
【解决方案3】:

看python执行时间和估计数据库质量是错误的。每个请求至少包含 3 个部分:

  • 请求准备(客户端),
  • 请求执行(服务器),
  • 响应准备(客户端)

根据我的经验,MongoDB=>python 的数据转换比 MySQL=>python 需要更多时间。

您还应该在两个数据库中都使用索引。只有在用于查询的字段上有索引时,MongoDB 才能正常工作。 说到 MySQL,我觉得最好在 innoDB 上测试性能,MyISAM 不支持事务、外键、触发器,对我来说有点过时了。

【讨论】:

  • 因为我想用python,所以我关心的是database+python,而不是只关心database。
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 2012-12-04
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2014-12-30
  • 2016-11-17
  • 2011-01-09
相关资源
最近更新 更多