2011-09-21 76 views
7

几个月前我发现了mongodb,在看完这个post之后,我想mongodb比mysql真的快,所以我决定建立自己的工作台,问题是我没有和上述文章的作者相同的结果,尤其是对于查询数据库:mongodb似乎比MyISAM表慢。你可以看看我的Python代码,可能是有什么不对的吧:MongoDB不比MySQL快吗?

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的具有 '关键' 列索引

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千兆赫

结果(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) 
+3

首先,MongoDB喜欢64位架构。对于那些对基准系统之一不太熟悉的人来说,我不会投入太多库存。 – ceejayoz

+0

这就是为什么我要求一些帮助! – Eric

+9

@ceejayoz如果你必须非常有经验才能使它快速发展,那么对于大多数用户来说,它会很慢。我认为没有经验的用户制定的基准测试可能同样有用...... –

回答

6
MySQL insert elapse : 0:02:52.143803 
Mongodb insert elapse : 0:00:49.038416 -> mongodb much faster for insert 

由于mongodb将所有数据插入ram,然后周期性地将数据刷新到光盘,Mongodb插入快得多。

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快。

+6

插入速度更快,因为它不执行MySQL的操作。 safe = true插入比较慢(比特通常比MySQL更快),并且复制写入或fsync写入仍然较慢。要点是,像这样的比较是可疑的。他们做了截然不同的事情。 –

+0

我同意你的看法,但我没有比较,我只是说他为什么在他的基准测试中更快。由于默认情况下安全= false,它意味着每分钟刷新。 –

27

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

有很多变量(应用程序功能需求,硬件资源,并发性,配置,可伸缩性等)考虑任何基于“MongoDB比MySQL快”或反之亦然的基准或文章正在推广结果无用点。

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

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

最后,比较这样的插页也有点不合适。 MongoDB可以实现令人惊叹的插入吞吐量,并且可以忽略大容量插入,或者在复制和写入复制时可以慢几个数量级。这里的事情是,MongoDB为你提供了一个MySQL不选择(或更少)的选择。因此,这里的比较只能说明业务需求允许火灾和忘记类型写入(可以归结为“我希望它可以工作,但如果没有的话不会太大”)

TL; DR stop doing doing simple吞吐量基准。他们几乎总是没用。

+2

+1对于一个优秀的答案,我只是想补充一点,MySQL提供了大量的存储引擎 - 其中之一是TokuDB,它使用分形树来实现出色的插入速度。 –

+1

为了充分披露,我想在此补充一点,我是一个庞大的MongoDB粉丝。但它并不是万能的魔法数据库,也不是10gen声称的。 –

+1

我完全同意你的看法,但是通常缺乏确定某个软件受欢迎程度的知识。一个人说MongoDB确实[插入多个QPS]超过了[插入与MongoDB无关的功能完全相同的功能],突然之间所有因“X比Y好”而受到污染的互联网都被没有实际工作经验的人所基准。正确工作的正确工具应该是任何程序员的口头禅。 –

2

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

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

通过我的经验数据convertion for MongoDB => python比MySQL => python需要更多的时间。

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

+2

因为我想使用python,所以我关心数据库+ python,而不是数据库。 – Eric