首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB比MySQL快吗?

问MongoDB比MySQL快吗?
EN

Stack Overflow用户
提问于 2011-09-21 14:00:53
回答 3查看 8K关注 0票数 9

几个月前,我发现了mongodb,在阅读了这个post之后,我认为mongodb确实比mysql更快,所以我决定构建自己的工作台,问题是我的结果与上面文章的作者没有相同的结果,特别是在查询数据库方面: mongodb似乎比MyISAM表慢。您能看看我的python代码吗,可能它有什么问题:

代码语言:javascript
复制
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表:

代码语言:javascript
复制
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;

版本如下:

5.1.41

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

F 222

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

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2011-09-21 14:41:50

叹一口气。这种基准测试,我在本例中松散地使用了这个术语,通常从一开始就分解。MySQL不是一个比MongoDB慢的数据库。一个是关系数据库,另一个是NoSQL文档存储。在其设计涵盖的职能领域,它们将/应该更快。对于MySQL (或任何关系数据库管理系统)和MongoDB,这种重叠并不像很多人想象的那样大。这是一种与Redis和MongoDB讨论相比较的破碎苹果和橙子。

变量太多(应用程序功能需求、硬件资源、并发性、配置、可伸缩性等)。认为任何以"MongoDB比MySQL更快“结尾的基准或文章,都是将结果推广到无用的地步。

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

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

最后,像这样的插入比较也有一点不完善。MongoDB可以使用fire实现惊人的插入吞吐量,而忘记批量插入,或者使用fsynced复制写操作时会慢几个数量级。这里的问题是,MongoDB为您提供了一个选择,而MySQL没有这样做(或者更少)。因此,这里的比较只说明了业务需求允许火和忘记类型写(这归结为,“我希望它能工作,但如果它没有”)

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

票数 31
EN

Stack Overflow用户

发布于 2011-09-21 14:16:59

代码语言:javascript
复制
MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert

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

代码语言:javascript
复制
MySQL select elapse : 0:04:43.675914
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was

当您将数据嵌入/去角色化时,您可以在mongodb中获得最佳性能。在许多情况下,mongodb允许我们避免因嵌入/反规范化而加入。

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

顺便说一句:在MongoDB2.0中,indexes比mysql快25%,所以我猜2.0比mysql工作得更快。

票数 7
EN

Stack Overflow用户

发布于 2011-09-21 15:16:20

查看python执行时间和估计数据库质量是错误的。每项请求至少由3部分组成:

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7501100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档