MySQL vs MongoDB 1000 lecturas


He estado muy entusiasmado con MongoDB y lo he estado probando últimamente. Tenía una tabla llamada posts en MySQL con cerca de 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 alrededor de 1,000 veces cada uno para mysql y MongoDB y me sorprende que no note mucha diferencia en la velocidad. Tal vez 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 cpu i7 de doble núcleo + ( 2 hilos ) y 4 GB de 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 Ejemplo 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;
}
?>
Author: informatik01, 2012-03-14

7 answers

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 realmente no debe esperar que sus resultados sean muy diferentes. Después de todo, MySQL y MongoDB son ambos GPL, por lo que si Mongo tenía un código IO mágicamente mejor, entonces el equipo de MySQL podría incorporarlo en su base de código.

La gente está viendo el rendimiento de MongoDB en el mundo real en gran medida porque MongoDB le permite consultar en un manera que es más sensible a su carga de trabajo.

Por ejemplo, considere un diseño que persistió una gran cantidad de información sobre una entidad complicada de una manera normalizada. Esto podría usar fácilmente docenas de tablas en MySQL (o cualquier bd relacional) para almacenar los datos en forma normal, con muchos índices necesarios para garantizar la integridad relacional entre tablas.

Ahora considere el mismo diseño con un almacén de documentos. Si todas esas tablas relacionadas están subordinadas a la tabla principal (y a menudo son), entonces usted podría ser capaz de modelar los datos de tal manera que toda la entidad se almacena en un solo documento. En MongoDB puede almacenar esto como un solo documento, en una sola colección. Aquí es donde MongoDB comienza a habilitar un rendimiento superior.

En MongoDB, para recuperar toda la entidad, tienes que realizar:

  • Una búsqueda de índice en la colección (suponiendo que la entidad se obtiene por id)
  • Recuperar el contenido de una página de base de datos (el json binario real documento)

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 memoria, entonces 1 IO.

En MySQL con 20 tablas, debe realizar:

  • Una búsqueda de índice en la tabla raíz (de nuevo, suponiendo que la entidad se obtiene por id)
  • Con un índice agrupado, podemos suponer que los valores para la fila raíz están en el índice
  • 20 + búsquedas de rango (con suerte en un índice) para el pk de la entidad valor
  • Estos probablemente no son índices agrupados, por lo que las mismas 20+ búsquedas de datos una vez que averiguamos cuáles son las filas secundarias apropiadas.

Así que el total para mysql, incluso suponiendo que todos los índices están en memoria (que es más difícil ya que hay 20 veces más de ellos) es de aproximadamente 20 búsquedas de rango.

Estas búsquedas de rango probablemente estén compuestas por IO aleatorios: las diferentes tablas definitivamente residirán en diferentes puntos en el disco, y es posible que diferentes filas en el mismo el rango en la misma tabla para una entidad puede no ser contiguo (dependiendo de cómo se haya actualizado la entidad, etc.).

Así que 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.

 562
Author: Sean Reilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-11 01:09:58

¿Tiene concurrencia, es decir, usuarios simultáneos ? Si solo ejecuta 1000 veces la consulta directamente, con un solo hilo, casi no habrá diferencia. Demasiado fácil para estos motores :)

PERO le sugiero encarecidamente que cree una sesión de prueba de carga verdadera, lo que significa usar un inyector como JMeter con 10, 20 o 50 usuarios AL MISMO TIEMPO para que pueda ver realmente una diferencia (intente incrustar este código dentro de una página web que JMeter podría consultar).

Acabo de hacerlo 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 test : concurrency & MySQL engine. Luego, las necesidades de diseño de datos/esquemas y aplicaciones son, por supuesto, requisitos enormes, más allá de los tiempos de respuesta. Avísame cuando obtengas resultados, ¡también necesito información sobre esto!

 51
Author: theAndroid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-02 19:07:10

Fuente: https://github.com/webcaetano/mongo-mysql

10 filas

mysql insert: 1702ms
mysql select: 11ms

mongo insert: 47ms
mongo select: 12ms

100 filas

mysql insert: 8171ms
mysql select: 10ms

mongo insert: 167ms
mongo select: 60ms

1000 filas

mysql insert: 94813ms (1.58 minutes)
mysql select: 13ms

mongo insert: 1013ms
mongo select: 677ms

10.000 filas

mysql insert: 924695ms (15.41 minutes)
mysql select: 144ms

mongo insert: 9956ms (9.95 seconds)
mongo select: 4539ms (4.539 seconds)
 27
Author: user2081518,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 10:41:33

Hombre,,, la respuesta es que básicamente estás probando PHP y no una base de datos.

No te molestes en iterar los resultados, ya sea comentando la impresión o no. hay mucho tiempo.

   foreach ($cursor as $obj)
    {
        //echo $obj["thread_title"] . "<br><Br>";
    }

Mientras que el otro trozo está gastando yacking un montón de números rand.

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000) ;

    }
    return $numbers;
}

Entonces hay una gran diferencia b / w implosionar y en.

Y finalmente lo que está pasando aquí. parece crear una conexión cada vez, por lo tanto, está probando el tiempo de conexión más la consulta tiempo.

$m = new Mongo();

Vs

$db = new AQLDatabase();

Así que su 101% más rápido podría llegar a ser 1000% más rápido para la consulta subyacente despojado de jazz.

Urghhh.

 17
Author: Gabe Rainbow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-02 08:13:09

Https://github.com/reoxey/benchmark

Parámetro

Comparación de velocidad de MySQL y MongoDB en GOLANG1. 6 y PHP5

Sistema utilizado para benchmark: DELL cpu i5 4th gen 1.70 Ghz * 4 ram 4GB GPU ram 2GB

Comparación de velocidad de RDBMS vs NoSQL para INSERTAR, SELECCIONAR, ACTUALIZAR, ELIMINAR ejecutando diferentes números de filas 10,100,1000,10000,100000,1000000

El lenguaje utilizado para ejecutar es: PHP5 & Google fastest language GO 1.6

________________________________________________
GOLANG with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      1.195444ms
100                     6.075053ms
1000                    47.439699ms
10000                   483.999809ms
100000                  4.707089053s
1000000                 49.067407174s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 872.709µs


        SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 20.717354746s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 2.309209968s
100000                  257.411502ms
10000                   26.73954ms
1000                    3.483926ms
100                     915.17µs
10                      650.166µs


            DELETE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 6.065949ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


________________________________________________
GOLANG with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      2.067094ms
100                     8.841597ms
1000                    106.491732ms
10000                   998.225023ms
100000                  8.98172825s
1000000                 1m 29.63203158s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 5.251337439s


        FIND & DISPLAY (with index declared)
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 21.540603252s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1                       1.330954ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 10                     0.0040680000000001s
 100                    0.011595s
 1000                   0.049718s
 10000                  0.457164s
 100000                 4s
 1000000                42s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 1000000                <1s


            SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
  1000000               20s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MongoDB 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      0.065744s
100                     0.190966s
1000                    0.2163s
10000                   1s
100000                  8s
1000000                 78s


            FIND
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 <1s


            FIND & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 7s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 9s
 9
Author: Reoxey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-06 09:54:29

Aquí está 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 alguna diferencia de velocidad bruta. Conclusión en la página 35-36:

RDBMS vs NoSQL: Comparación de rendimiento y Escalado

El proyecto probó, analizó y comparó el rendimiento y escalabilidad de los dos tipos de base de datos. Los experimentos realizados incluyen correr diferente números y tipos de consultas, algunas más complejas que otros, con el fin de analizar cómo las bases de datos escalado con mayor carga. El factor más importante en este caso fue el tipo de consulta utilizado como MongoDB podría manejar consultas más complejas más rápido debido principalmente a su esquema más simple en el sacrificio de la duplicación de datos, lo que significa que un La base de datos NoSQL puede contener grandes cantidades de datos duplicados. Aunque se podría utilizar un esquema directamente migrado desde el RDBMS eliminar el ventaja de la representación de datos subyacente de MongoDB subdocuments which allowed the use of less queries towards the base de datos como tablas se combinaron. A pesar de la ganancia de rendimiento que MongoDB tenía más de MySQL en estas consultas complejas, cuando el punto de referencia modeló la consulta MySQL de manera similar a la consulta compleja MongoDB por usando anidados selecciona MySQL realizó mejor aunque en números más altos de las conexiones los dos se comportaron de manera similar. El último tipo de consulta benchmarked que era la consulta compleja que contiene dos JOINS y y un subconsulta mostró la ventaja que MongoDB tiene sobre MySQL debido a su uso de subdocumento. Esta ventaja se produce a costa de la duplicación de datos lo que provoca un aumento en el tamaño de la base de datos. Si tales consultas son típico en una aplicación, entonces es importante considerar NoSQL bases de datos como alternativas mientras se toma en cuenta el costo en almacenamiento y tamaño de memoria resultante de la mayor tamaño de la base de datos.

 4
Author: Jason Hitchings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 17:43:46

En un solo servidor, MongoDB no sería más rápido que mysql MyISAM tanto en lectura como en escritura, dada la tabla / doc los tamaños son pequeños de 1 GB a 20 GB.
MonoDB será más rápido en Parallel Reduce en clústeres Multi-Nodo, donde Mysql NO puede escalar horizontalmente.

 -5
Author: zhuomin chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-03 20:21:42