J'ai découvert mongodb il y a quelques mois, et après avoir lu cet article, je me suis rendu compte qu'il n'y avait pas de problème. post Je pensais que mongodb était vraiment plus rapide que mysql, j'ai donc décidé de construire mon propre banc, le problème est que je n'ai pas le même résultat que l'auteur du post ci-dessus, notamment pour l'interrogation de la base de données : mongodb semble être plus lent que les tables MyISAM. Pourriez-vous jeter un coup d'oeil à mon code python, il y a peut-être quelque chose qui ne va pas :
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
Notes :
- MySQL et mongodb sont tous deux sur locahost.
- MySQL et mongodb ont tous deux une colonne 'key' indexée.
Table 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;
Les versions sont :
- MySQL : 5.1.41
- mongodb : 1.8.3
- python : 2.6.5
- pymongo : 2.0.1
- Linux : Ubuntu 2.6.32 32Bits avec PAE
- Matériel : Desktop core i7 2.93 Ghz
Résultats (pour 1 million d'insertions/sélections) :
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)