MongoDB vs MySQL / MariaDB
By: Date: enero 3, 2016 Categories: En la opinion de...

Después que escribí el artículo sobre Armageddon by Megabyte, un amigo me hizo notar que la DB correcta para esa misión habría sido MongoDB y me compartió el siguiente el siguiente link

http://skaruz.com/en/2012/01/mongodb-vs-mysql-myisam-and-innodb-performance-comparison/

Esta comparación fue hecha por Grzegorz Skaruz un desarrollador con unas credenciales muy impresionantes según linkedin

lo primero que note al ver ese link es que al igual que el artículo de Armageddon resulta que es una comparación mal hecha ademas que usa simples WHERE en las consultas SQL, porque si se trata de hacer una comparación real tienes que llevar al límite las bases de datos que estas auditando en su rendimiento y de esa forma ser imparcial, que gane quien tenga que ganar.

Según Grzegorz Skaruz este asunto da los siguientes resultados con 217 mil registros. ( para mí son muy pocos )

MySQL (MyISAM)    MySQL (innoDB)    mongoDB
WHERE field = ?    3.631    21.911      0.016
WHERE field zLIKE ‘x%’    3.755    19.562      0.040

Hace competir a MySQL contra MongoDB usando los 2 motores clásicos, InnoDB y MyISAM , donde obviamente MyISAM es el más veloz de ambos y aun así MongoDB sale victorioso, ¿ pero es esto posible ?

No me quede con la duda y subí la apuesta a niveles de estresar una DB lo suficiente para que medir los tiempos de respuesta en forma muy holgada. No hablo de 217 mil registros, no eso es poco para cualquier DB, 1 millón de registros.

Peso del archivo fuente.

-rw-r–r– 1 root root 768640542 dic 27 17:52 /root/nombre.txt

El archivo fuente pesa la cantidad de 733 MB (768,640,542)

Gasto de Disco duro por MongoDB

El comando para importar el archivo

mongoimport --type csv --file nombre.txt -d perfil -c nombres --headerline

El tiempo de la importación es de

real 52m16.730s
user 2m45.241s
sys 0m42.226s

El consumo de disco duro de la importación termina con 15 GB

-rw——- 1 root root 67108864 dic 28 13:08 local.0
-rw——- 1 root root 16777216 dic 28 13:08 local.ns
-rwxr-xr-x 1 root root 6 dic 28 13:08 mongod.lock
-rw——- 1 root root 67108864 dic 28 13:33 perfil.0
-rw——- 1 root root 134217728 dic 28 13:21 perfil.1
-rw——- 1 root root 268435456 dic 28 13:23 perfil.2
-rw——- 1 root root 536870912 dic 28 13:26 perfil.3
-rw——- 1 root root 1073741824 dic 28 14:07 perfil.4
-rw——- 1 root root 2146435072 dic 28 13:56 perfil.5
-rw——- 1 root root 2146435072 dic 28 13:56 perfil.6
-rw——- 1 root root 2146435072 dic 28 14:07 perfil.7
-rw——- 1 root root 2146435072 dic 28 14:13 perfil.8
-rw——- 1 root root 2146435072 dic 28 14:13 perfil.9
-rw——- 1 root root 16777216 dic 28 14:12 perfil.ns
drwxr-xr-x 2 root root 6 dic 28 14:07 _tmp

[root@linuxlibre mongo]# du -h
2.0G ./journal
0 ./_tmp


[root@linuxlibre nombres]# du -h
15G

Gasto de Disco duro por MySQL con motor MyISAM

El comando para importar el archivo

mysqlimport --delete --fields-terminated-by=',' --fields-escaped-by='\' --lines-terminated-by='\n' --local --lock-tables --verbose nombres /root/perfil.txt

El tiempo de la importación fue

real 3m37.700s
user 0m0.113s
sys 0m0.433s

El consumo de disco duro de la importación termina con 2.4 GB

-rw-rw—- 1 mysql mysql 65 dic 28 17:43 db.opt
-rw-rw—- 1 mysql mysql 8590 dic 28 18:21 perfil.frm
-rw-rw—- 1 mysql mysql 1483647080 dic 28 18:25 perfil.MYD
-rw-rw—- 1 mysql mysql 1071191040 dic 28 18:25 perfil.MYI

[root@linuxlibre nombres]# du -h
2.4G

El resultado de consumo de disco duro es

MongoDB 15 GB, MySQL 2.7 GB
Tiempo de importación MongoDB 52 Min, MySQL menos de 4 Minutos.

Desde aquí ya se puede ver una clara ventaja en MySQL clarísima si tomamos en cuenta la diferencia de tiempo y espacio ocupado en disco duro de un archivo fuente  que no excedía ni el Giga Byte de datos. Con todo el gasto de espacio de disco llegue a creer que en la prueba de rendimiento MongoDB daría una paliza a MySQL pensé que tener un gasto de 15GB habría sido para acomodar la información de tal manera que al realizar una consulta esta seria INMEDIATA. Pero no fue así, otros programadores me hicieron ver que estaba usando MongoDB sin índices, pero también estaba usando a MySQL MyISAM sin índices, a puro select * from y where. Por lo que la comparación seguía siendo justa, al agregarle índices a MongoDB esta empezó a funcionar de manera más eficaz de forma superior a MySQL, pero no sería una comparación justa, MySQL no estaba usando índices, así que le agregue índices

Creando el índice con MongoDB


> db.perfil.createIndex({"nombre" : "text"})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

•    Aquí des afortunadamente MongoDB no regresa el tiempo que le toma construir el índice, pero fueron aproximadamente 10 minutos, tal vez más.

Creando los índices en MySQL MyISAM

MariaDB [nombres]> Create FULLTEXT INDEX nombre ON perfil (nombre);
Query OK, 100182354 rows affected (3 min 31.83 sec)
Records: 100182354 Duplicates: 0 Warnings: 0

Tiempo para crear el índice menos de 4 minutos.

Prueba de rendimiento

Finalmente hice un programa para consultar MongoDB y otro para MySQL, la diferencia del código radica en las líneas de conexión, pero la consulta prentende ser la misma e igualmente fueron medidas.

Código fuente del programa para consulta de MongoDB

<?php

try
{
$conn = new MongoClient();
$db = $conn->selectDB("perfil");
$col = $db->selectCollection("NOMBRE");

}
catch(Exception $e)
{
echo $e;
}
$query = array('$text'=>array('$search' => $argv[1]));

$consulta = $col->find($query);

$c = 0;
while ($consulta->hasNext()) {
$e = $consulta->getNext();
echo $e["NOMBRE"]."\n";
$c++;
}
echo "Registros encontrados $c \n";
?>

Código fuente del programa de MySQL

<?php

include ("phpdbmodel.php");

$db = new phpdbmodel();
$db->host = "localhost";
$db->db = "nombres";
$db->driver = "mysql";
$db->user = "root";

$db -> connect();

// $consulta = $db->Find("nombre","LORENA");

$consulta = $db->Query ("select nombre from perfil where MATCH (nombre) AGAINST ('$argv[1]' IN BOOLEAN MODE);");

$c = 0;

foreach ($consulta as $e)
{
echo $e["nombre"]."\n";
$c++;
}

echo "Registros encontrados $c \n";
?>

Llegado a este punto la demostración ya no será en texto, será en vídeo para poder mostrar el rendimiento al hacer consultas en ambas bases de datos, para mí el ganador indiscutible es MySQL / MariaDB, pero ustedes pueden realizar sus propias pruebas y sacar sus propias conclusiones.

Video de rendimiento My]SQL vs MongoDB

5 thoughts on “MongoDB vs MySQL / MariaDB

  1. Usa: Mozilla Firefox Mozilla Firefox 43.0 - Detectado...

    Esta excelente la comparativa, Mariadb muy bueno en estabilidad y rendimiento, tienes algúna experiencia en uso con perconadb, esta bastante interesante también en rendimiento, saludos.

  2. Usa: Google Chrome Google Chrome 47.0.2526.106 en Linux Linux - Detectado...

    Compártela, si ya la compartí es para nuestra comunidad hispana, que de hecho ese es el motivo del por cual no escribo mi blog en ingles, para potenciar a nuestros informáticos

  3. Usa: Mozilla Firefox Mozilla Firefox 43.0 en Windows Windows 7 - Detectado...

    Oye, según MongoDB es una BD no-SQL, será que eso le haya pegado al rendimiento?

    1. Usa: Google Chrome Google Chrome 47.0.2526.106 en Windows Windows NT - Detectado...

      Estas en lo correcto, MongoDB es una No-SQL ( No relacionada, aveces ) es justamente por eso que deberia ser mas rapida.

      MySQL MyISAM es SQL no relacionado, no tiene llaves foraneas, ni bloqueo de tablas. MySQL MyISAM se puede considerar que entonces tampoco es relacionada.

      MySQL InnoDB es una base de datos relacionada con todas las de la ley e incluso es muy obediente cuando le dices que un campo no acepta nulos. Lo hace. No los acepta = )

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *