【发布时间】: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 有更好的机会做好。如果不学习如何优化它,您就无法在生产中使用新技术。