9 votes

MongoDB n'est pas plus rapide que MySQL ?

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)

31voto

Remon van Vliet Points 10795

Soupir. Ce type d'évaluation, et j'utilise le terme au sens large dans ce cas, tombe généralement en panne dès le début. MySQL n'est pas une base de données "plus lente" que MongoDB. L'une est une base de données relationnelle, l'autre un magasin de documents NoSQL. Elles seront/devraient être plus rapides dans les domaines fonctionnels pour lesquels elles ont été conçues. Dans le cas de MySQL (ou de tout autre SGBDR) et de MongoDB, ce chevauchement n'est pas aussi important que beaucoup de gens le pensent. C'est le même genre de comparaison entre des pommes et des oranges que l'on retrouve dans les discussions entre Redis et MongoDB.

Il y a tellement de variables (exigences fonctionnelles de l'application, ressources matérielles, concurrence, configuration, évolutivité, etc.) à prendre en compte que tout benchmark ou article qui se termine par "MongoDB est plus rapide que MySQL" ou vice versa généralise les résultats au point de les rendre inutiles.

Si vous voulez faire du benchmarking, définissez d'abord un ensemble strict d'exigences fonctionnelles et de règles métier, puis mettez-les en œuvre aussi efficacement que possible sur les deux solutions de persistance. Le résultat sera que l'une est plus rapide que l'autre et, dans presque tous les cas, l'approche la plus rapide présente des inconvénients pertinents qui peuvent rendre la solution la plus lente plus viable en fonction des exigences.

Tout cela en ignorant que le benchmark ci-dessus ne simule aucune sorte de scénario réel. Il n'y a pas beaucoup d'applications qui font des insertions à débit maximal sans aucune sorte de threading/concurrence (ce qui a un impact significatif sur les performances de la plupart des solutions de stockage).

Enfin, comparer des inserts comme celui-ci est aussi un peu cassant. MongoDB peut atteindre un débit d'insertion incroyable avec des insertions en vrac, ou être plusieurs fois plus lent avec des écritures répliquées et synchronisées. Le fait est que MongoDB vous offre un choix là où MySQL ne le fait pas (ou moins). La comparaison n'a donc de sens que si les besoins de l'entreprise permettent des écritures de type "fire and forget" (ce qui se résume à "j'espère que cela fonctionnera, mais ce n'est pas grave si ce n'est pas le cas").

TL;DR : arrêtez de faire des benchmarks simples sur le débit. Ils sont presque toujours inutiles.

7voto

Andrew Orsich Points 24503
MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert

Les insertions de mongodb sont beaucoup plus rapides parce que mongodb insère toutes les données dans la mémoire vive, puis évacue périodiquement les données sur le disque.

MySQL select elapse : 0:04:43.675914
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was

Vous pouvez obtenir les meilleures performances avec mongodb lorsque vous intégrez/dénormalisez vos données. Dans de nombreuses situations, mongodb nous permet d'éviter les jointures grâce à l'intégration et à la dédenormalisation.

Et lorsque vous insérez simplement des données dans une collection/table et que vous les lisez par index, mongodb n'est pas censé être plus rapide, la vitesse de lecture devrait être à peu près la même si on la compare à celle d'une base de données sql.

BTW : Dans mongodb 2.0 indices 25% plus rapide, donc je suppose que la 2.0 fonctionnera plus vite que mysql.

2voto

varela Points 478

Il est faux de regarder le temps d'exécution de python et d'estimer la qualité de la base de données. Chaque demande est composée d'au moins 3 parties :

  • préparation de la demande (côté client),
  • exécution de la demande (serveur),
  • préparation de la réponse (côté client)

D'après mon expérience, la conversion des données pour MongoDB=>python prend beaucoup plus de temps que pour MySQL=>python.

Vous devez également utiliser des index dans les deux bases de données. MongoDB ne fonctionne bien que si vous avez des index sur les champs que vous utilisez pour les requêtes. En ce qui concerne MySQL, je pense qu'il est préférable de tester les performances sur innoDB, MyISAM ne prend pas en charge les transactions, les clés étrangères, les déclencheurs et, pour ma part, il est un peu dépassé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X