几个月前,我发现了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表:
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
F 222
结果(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)发布于 2011-09-21 14:41:50
叹一口气。这种基准测试,我在本例中松散地使用了这个术语,通常从一开始就分解。MySQL不是一个比MongoDB慢的数据库。一个是关系数据库,另一个是NoSQL文档存储。在其设计涵盖的职能领域,它们将/应该更快。对于MySQL (或任何关系数据库管理系统)和MongoDB,这种重叠并不像很多人想象的那样大。这是一种与Redis和MongoDB讨论相比较的破碎苹果和橙子。
变量太多(应用程序功能需求、硬件资源、并发性、配置、可伸缩性等)。认为任何以"MongoDB比MySQL更快“结尾的基准或文章,都是将结果推广到无用的地步。
如果您想做基准测试,首先定义一组严格的功能需求和业务规则,然后在这两种持久性解决方案上尽可能有效地实现它们。其结果将是一个比另一个更快,而且在几乎所有情况下,更快的方法都有一些相关的缺点,这可能仍然会使缓慢的解决方案更可行,这取决于需求。
所有这一切都忽略了上面的基准没有模拟任何类型的真实世界场景。在没有任何线程/并发性的情况下,不会有很多应用程序执行最大吞吐量插入(这会显著影响大多数存储解决方案的性能)。
最后,像这样的插入比较也有一点不完善。MongoDB可以使用fire实现惊人的插入吞吐量,而忘记批量插入,或者使用fsynced复制写操作时会慢几个数量级。这里的问题是,MongoDB为您提供了一个选择,而MySQL没有这样做(或者更少)。因此,这里的比较只说明了业务需求允许火和忘记类型写(这归结为,“我希望它能工作,但如果它没有”)
DR停止执行简单的吞吐量基准测试。它们几乎总是没用的。
发布于 2011-09-21 14:16:59
MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416 -> mongodb much faster for insertMongodb插入速度要快得多,因为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数据库相比,读取速度应该是相同的。
顺便说一句:在MongoDB2.0中,indexes比mysql快25%,所以我猜2.0比mysql工作得更快。
发布于 2011-09-21 15:16:20
查看python执行时间和估计数据库质量是错误的。每项请求至少由3部分组成:
根据我的经验,MongoDB=>python的数据转换要比MySQL=>python花费更多的时间。
此外,您应该在两个数据库中使用索引。只有在对用于查询的字段具有索引的情况下,MongoDB才能正常工作。谈到MySQL,我认为最好在innoDB上测试性能,MyISAM不支持事务、外键、触发器,对我来说,它有点过时了。
https://stackoverflow.com/questions/7501100
复制相似问题