He estado muy entusiasmado con MongoDb y lo he estado probando últimamente. Tenía una tabla llamada posts en MySQL con aproximadamente 20 millones de registros indexados solo en un campo llamado 'id'.
Quería comparar la velocidad con MongoDB y ejecuté una prueba que obtendría e imprimiría 15 registros al azar de nuestras enormes bases de datos. Ejecuté la consulta unas 1,000 veces cada una para mysql y MongoDB y me sorprende que no note mucha diferencia en la velocidad. Quizás MongoDB es 1.1 veces más rápido. Eso es muy decepcionante. ¿Hay algo que estoy haciendo mal? Sé que mis pruebas no son perfectas, pero MySQL está a la par con MongoDb cuando se trata de leer tareas intensivas.
Nota:
- Tengo dual core + (2 hilos) i7 cpu y 4GB ram
- Tengo 20 particiones en MySQL, cada una de 1 millón de registros
Código de muestra utilizado para probar MongoDB
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$m = new Mongo();
$db = $m->swalif;
$cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
?>
Código de muestra para probar MySQL
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH . "classes/forumdb.php");
$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$db = new AQLDatabase();
$sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
$result = $db->executeSQL($sql);
while ($row = mysql_fetch_array($result) )
{
//echo $row["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000);
}
return $numbers;
}
?>
fuente
Respuestas:
MongoDB no es mágicamente más rápido. Si almacena los mismos datos, organizados básicamente de la misma manera, y accede a ellos exactamente de la misma manera, entonces no debería esperar que sus resultados sean muy diferentes. Después de todo, MySQL y MongoDB son GPL, por lo que si Mongo tuviera un código IO mágicamente mejor, entonces el equipo de MySQL podría incorporarlo a su base de código.
La gente está viendo el rendimiento de MongoDB en el mundo real en gran medida porque MongoDB le permite realizar consultas de una manera diferente que sea más sensible a su carga de trabajo.
Por ejemplo, considere un diseño que persistió con mucha información sobre una entidad complicada de manera normalizada. Esto podría usar fácilmente docenas de tablas en MySQL (o cualquier base de datos relacional) para almacenar los datos en forma normal, con muchos índices necesarios para garantizar la integridad relacional entre las tablas.
Ahora considere el mismo diseño con una tienda de documentos. Si todas esas tablas relacionadas están subordinadas a la tabla principal (y a menudo lo están), es posible que pueda modelar los datos de modo que toda la entidad se almacene en un solo documento. En MongoDB puede almacenar esto como un solo documento, en una sola colección. Aquí es donde MongoDB comienza a permitir un rendimiento superior.
En MongoDB, para recuperar toda la entidad, debe realizar:
Entonces, una búsqueda de árbol b y una página binaria leída. Log (n) + 1 IOs. Si los índices pueden residir completamente en la memoria, entonces 1 IO.
En MySQL con 20 tablas, debe realizar:
Entonces, el total de mysql, incluso suponiendo que todos los índices estén en la memoria (lo cual es más difícil ya que hay 20 veces más de ellos) es de aproximadamente 20 búsquedas de rango.
Es probable que estas búsquedas de rango estén compuestas de E / S aleatorias: diferentes tablas definitivamente residirán en diferentes puntos en el disco, y es posible que diferentes filas en el mismo rango en la misma tabla para una entidad no sean contiguas (dependiendo de cómo haya sido la entidad) actualizado, etc.).
Entonces, para este ejemplo, la cuenta final es aproximadamente 20 veces más IO con MySQL por acceso lógico, en comparación con MongoDB.
Así es como MongoDB puede aumentar el rendimiento en algunos casos de uso .
fuente
¿Tiene concurrencia, es decir, usuarios simultáneos? Si solo ejecuta 1000 veces la consulta directamente, con solo un hilo, casi no habrá diferencia. Demasiado fácil para estos motores :)
PERO le sugiero que cree una verdadera sesión de prueba de carga, lo que significa usar un inyector como JMeter con 10, 20 o 50 usuarios AL MISMO TIEMPO para que realmente pueda ver la diferencia (intente incrustar este código dentro de una página web JMeter podría consultar).
Lo hice hoy en un solo servidor (y una simple colección / tabla) y los resultados son bastante interesantes y sorprendentes (MongoDb fue realmente más rápido en escrituras y lecturas, en comparación con el motor MyISAM y el motor InnoDb).
Esto realmente debería ser parte de su prueba: concurrencia y motor MySQL. Entonces, las necesidades de diseño y aplicación de datos / esquemas son, por supuesto, requisitos enormes, más allá de los tiempos de respuesta. Avísame cuando obtengas resultados, ¡también necesito comentarios sobre esto!
fuente
Fuente: https://github.com/webcaetano/mongo-mysql
10 filas
100 filas
1000 filas
10.000 filas
fuente
hombre ,,, la respuesta es que básicamente estás probando PHP y no una base de datos.
no se moleste en repetir los resultados, ya sea comentando la impresión o no. Hay un poco de tiempo.
mientras que la otra parte es gastar un montón de números rand.
entonces hay una gran diferencia b / w implode y en.
y finalmente lo que está pasando aquí. parece crear una conexión cada vez, por lo tanto, prueba el tiempo de conexión más el tiempo de consulta.
vs
por lo que su 101% más rápido podría ser 1000% más rápido para la consulta subyacente despojada de jazz.
urghhh
fuente
https://github.com/reoxey/benchmark
punto de referencia
Comparación de velocidad de MySQL y MongoDB en GOLANG1.6 y PHP5
sistema utilizado para benchmark: DELL cpu i5 4th gen 1.70Ghz * 4 ram 4GB GPU ram 2GB
Comparación de velocidad de RDBMS vs NoSQL para INSERTAR, SELECCIONAR, ACTUALIZAR, BORRAR ejecutando diferentes números de filas 10,100,1000,10000,100000,1000000
El lenguaje utilizado para ejecutar es: PHP5 y el lenguaje más rápido de Google GO 1.6
fuente
Aquí hay una pequeña investigación que exploró RDBMS vs NoSQL usando MySQL vs Mongo, las conclusiones estaban en línea con la respuesta de @Sean Reilly. En resumen, el beneficio proviene del diseño, no de una diferencia de velocidad en bruto. Conclusión en la página 35-36:
RDBMS vs NoSQL: Comparación de rendimiento y escala
fuente
En Single Server, MongoDb no sería más rápido que mysql MyISAM tanto en lectura como en escritura, dado que los tamaños de tabla / documento son pequeños de 1 GB a 20 GB.
MonoDB será más rápido en Parallel Reduce en clústeres de múltiples nodos, donde Mysql NO puede escalar horizontalmente.
fuente