python - MongoDB 不是比 MySQL 快吗?

标签 python mysql mongodb

几个月前我发现了 mongodb,在阅读了这个 post 之后,我认为 mongodb 真的比 mysql 快,所以我决定建立自己的工作台,问题是我没有得到与上述帖子作者相同的结果,特别是对于查询数据库: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 都在本地主机上。
  • 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
  • python :2.6.5
  • pymongo:2.0.1
  • Linux:Ubuntu 2.6.32 32 位,带 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)

最佳答案

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

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

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

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

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

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

关于python - MongoDB 不是比 MySQL 快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7501100/

相关文章:

node.js - Mongoose Schema vs Mongo Validator

javascript - 如何打印 html 表格中仅一个单元格关联的结果集

python - Django/mysql中间表不插入数据

java - 在 MongoDB 中存储多个 JSON 文档(具有嵌套 JSON 键值对象的行数组格式)

python - 为什么 pandas 数据帧将整数转换为 float 据类型

python - 提取连接字符串的特定部分

python - 根据时差和 Pandas 数据框中列的条件创建一个新的数据框

python - 使用 sympy dsolve 进行简谐运动会返回错误的解

派生表中的 MySQL 联合 (related_id=a AND related_id=b) OR (related_id=z)

mysql - Rails 应用程序中的 MongoDB 或 MySQL 或两者