2011-09-21 16 views
7

Descubrí mongodb hace algunos meses, y después de leer este post, pensé que mongodb era realmente más rápido que mysql, así que decidí construir mi propio banco, el problema es que no tengo el mismo resultado que el autor del post anterior, especialmente para consultar la base de datos: mongodb parece ser más lento que las tablas MyISAM. Podría echar un vistazo a mi código Python, puede ser que hay algo malo en ella:MongoDB no es más rápido que 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 

Notas:

  • tanto MySQL y mongodb están en locahost.
  • tanto MySQL y mongodb tiene la columna 'clave' indexado

MySQL Tabla:

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; 

versiones son:

  • MySQL: 5.1.41
  • mongodb: 1,8 .3
  • python: 2.6.5
  • pymongo: 2.0.1
  • Linux: Ubuntu 2.6.32 32Bits con PAE
  • Hardware: Escritorio i7 núcleo 2,93 Ghz

Resultados (por 1 millón de partes movibles/selecciona):

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

Por un lado, a MongoDB le gusta una arquitectura de 64 bits. No pondría mucho inventario en un benchmark dirigido por alguien que no tenga mucha experiencia con uno de los sistemas que se están evaluando. – ceejayoz

+0

¡es por eso que pedí ayuda! – Eric

+9

@ceejayoz Si tiene que tener mucha experiencia para hacerlo rápido, será lento para la mayoría de los usuarios. Yo diría que los puntos de referencia hechos por usuarios inexpertos podrían ser tan útiles ... –

Respuesta

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

Mongodb se inserta mucho más rápido debido a mongodb inserte todos los datos en la memoria RAM y luego periódicamente descargue los datos en el disco.

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

Puede lograr el mejor rendimiento con mongodb cuando incruste/desnormalice sus datos. En muchas situaciones, mongodb nos permite evitar uniones debido a la incorporación/desnormalización.

Y cuando solo inserta datos en una colección/tabla y no se supone que la lectura por índice mongodb sea más rápida, la velocidad de lectura debería ser ~ misma si se compara con la base de datos sql.

BTW: en mongodb 2.0 indexes 25% más rápido, así que supongo que 2.0 funcionará más rápido que mysql.

+6

son más rápidas porque no hacen lo que hace MySQL. seguro = las inserciones verdaderas son un poco más lentas (bit generalmente aún más rápido que MySQL) y las escrituras replicadas o las escrituras fsync son aún más lentas. Siendo así, las comparaciones como estas son cuestionables. Hacen cosas muy diferentes. –

+0

Estoy de acuerdo contigo, pero no estoy comparando, acabo de decir por qué en su punto de referencia mongodb más rápido. Debido a que por defecto es seguro = falso y es malo en enjuague por minuto. –

27

suspiro. Este tipo de puntos de referencia, y uso el término libremente en este caso, generalmente se descomponen desde el principio. MySQL no es una base de datos "más lenta" que MongoDB. Una es una base de datos relacional, la otra es una tienda de documentos NoSQL. Deberán/deberían ser más rápidos en las áreas funcionales para las que fueron diseñados. En el caso de MySQL (o cualquier RDBMS) y MongoDB, esta superposición no es tan grande como mucha gente supone que es. Es el mismo tipo de comparación de manzanas y naranjas rotas que obtienes con las discusiones de Redis vs. MongoDB.

Existen tantas variables (requisitos funcionales de la aplicación, recursos de hardware, concurrencia, configuración, escalabilidad, etc.) que cualquier referencia o artículo que finalice con "MongoDB es más rápido que MySQL" o viceversa generalizar los resultados a el punto de la inutilidad

Si primero quiere hacer un benchmark, defina un conjunto estricto de requisitos funcionales y reglas de negocio y luego impleméntelos de la manera más eficiente posible en ambas soluciones de persistencia. El resultado será que uno es más rápido que el otro y, en casi todos los casos, el enfoque más rápido tiene algunas desventajas relevantes que aún pueden hacer que la solución más lenta sea más viable según los requisitos.

Todo esto es ignorar que el punto de referencia anterior no simula ningún tipo de escenario del mundo real. No habrá muchas aplicaciones que realicen inserciones de máximo rendimiento sin ningún tipo de subprocesamiento/concurrencia (lo que afecta significativamente el rendimiento en la mayoría de las soluciones de almacenamiento).

Por último, la comparación de inserciones como esta también está un poco rota. MongoDB puede lograr un increíble rendimiento de inserción con fuego y olvidarse de inserciones masivas o puede ser de órdenes mucho más lentas con grabaciones fsynced y replicadas. Lo que pasa aquí es que MongoDB te ofrece una opción donde MySQL no (o menos). Así que aquí la comparación solo tiene sentido para los requisitos de negocio permitir el fuego y olvidar escrituras tipo (que se reduce a, "Espero que funcione, pero no biggy si no fuera así")

TL; DR stop doing simple puntos de referencia de rendimiento. Casi siempre son inútiles.

+2

+1 para obtener una respuesta excelente, solo quería agregar que MySQL ofrece una gran cantidad de motores de almacenamiento, uno de ellos TokuDB que utiliza árboles fractales para lograr una velocidad de inserción excelente. –

+1

Con el interés de una divulgación completa, me gustaría añadir aquí que soy un gran fan de MongoDB. Pero no es la bala de la base de datos mágica para todo, ni 10gen dice que sea. –

+1

Estoy totalmente de acuerdo con usted, sin embargo, generalmente es la falta de conocimiento lo que determina la popularidad de un determinado software. Uno lee que MongoDB [inserta un número de QPS] más que [inserta algo completamente funcionalmente no relacionado con MongoDB] y de repente Internet está contaminado con "X es mejor que Y", evaluado por personas sin experiencia laboral real. La herramienta adecuada para el trabajo correcto debe ser el mantra de cualquier programador. –

2

Es incorrecto observar el tiempo de ejecución de Python y estimar la calidad de la base de datos. Cada solicitud consiste en al menos 3 partes:

  • solicitud de preparación (lado del cliente),
  • solicitud de ejecución (servidor),
  • respuesta de la preparación (lado del cliente)

Por mi experiencia de datos la conversión para MongoDB => python lleva mucho más tiempo que para MySQL => python.

También debe usar índices en ambas bases de datos. MongoDB funciona bien solo si tiene índices en los campos que utiliza para las consultas. Hablando de MySQL, creo que es mejor probar el rendimiento en innoDB, MyISAM no admite transacciones, claves externas, activadores y para mí está un poco desactualizado.

+2

Como quiero usar Python, me importa la base de datos + python, no solo la base de datos. – Eric

Cuestiones relacionadas