{"id":1612,"date":"2016-01-03T04:08:49","date_gmt":"2016-01-03T10:08:49","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1612"},"modified":"2016-01-04T14:28:09","modified_gmt":"2016-01-04T20:28:09","slug":"mongodb-vs-mysql","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1612","title":{"rendered":"MongoDB vs MySQL \/ MariaDB"},"content":{"rendered":"<p>Despu\u00e9s que escrib\u00ed el art\u00edculo sobre Armageddon by Megabyte, un amigo me hizo notar que la DB correcta para esa misi\u00f3n habr\u00eda sido MongoDB y me comparti\u00f3 el siguiente el siguiente link<\/p>\n<p><a href=\"http:\/\/skaruz.com\/en\/2012\/01\/mongodb-vs-mysql-myisam-and-innodb-performance-comparison\/\">http:\/\/skaruz.com\/en\/2012\/01\/mongodb-vs-mysql-myisam-and-innodb-performance-comparison\/<\/a><\/p>\n<p>Esta comparaci\u00f3n fue hecha por Grzegorz Skaruz un desarrollador con unas credenciales muy impresionantes seg\u00fan <a href=\"https:\/\/pl.linkedin.com\/in\/grzegorzskaruz\">linkedin <\/a><\/p>\n<p>lo primero que note al ver ese link es que al igual que el art\u00edculo de Armageddon resulta que es una comparaci\u00f3n mal hecha ademas que usa simples WHERE en las consultas SQL, porque si se trata de hacer una comparaci\u00f3n real tienes que llevar al l\u00edmite las bases de datos que estas auditando en su rendimiento y de esa forma ser imparcial, que gane quien tenga que ganar.<\/p>\n<p>Seg\u00fan Grzegorz Skaruz este asunto da los siguientes resultados con 217 mil registros. ( para m\u00ed son muy\u00a0pocos )<\/p>\n<blockquote><p>MySQL (MyISAM)\u00a0\u00a0 \u00a0MySQL (innoDB)\u00a0\u00a0 \u00a0mongoDB<br \/>\nWHERE field = ?\u00a0\u00a0 \u00a03.631\u00a0\u00a0 \u00a021.911 \u00a0\u00a0\u00a0 \u00a00.016<br \/>\nWHERE field zLIKE &#8216;x%&#8217;\u00a0\u00a0 \u00a03.755\u00a0\u00a0 \u00a019.562 \u00a0\u00a0\u00a0 \u00a00.040<\/p><\/blockquote>\n<p>Hace competir a MySQL contra MongoDB usando los 2 motores cl\u00e1sicos, InnoDB y MyISAM , donde obviamente MyISAM es el m\u00e1s veloz de ambos y aun as\u00ed MongoDB sale victorioso, \u00bf pero es esto posible ?<\/p>\n<p>No me quede con la duda y sub\u00ed 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\u00f3n de registros.<\/p>\n<p><strong>Peso del archivo fuente.<\/strong><\/p>\n<p>-rw-r&#8211;r&#8211; 1 root root 768640542 dic 27 17:52 \/root\/nombre.txt<\/p>\n<p>El archivo fuente pesa la cantidad de 733 MB (768,640,542)<\/p>\n<p><strong>Gasto de Disco duro por MongoD<\/strong>B<\/p>\n<p><strong>El comando para importar el archivo<\/strong><\/p>\n<p><code>mongoimport --type csv --file nombre.txt -d perfil -c nombres --headerline<\/code><\/p>\n<p><strong>El tiempo de la importaci\u00f3n es de<\/strong><\/p>\n<blockquote><p>real 52m16.730s<br \/>\nuser 2m45.241s<br \/>\nsys 0m42.226s<\/p><\/blockquote>\n<p>El consumo de disco duro de la importaci\u00f3n termina con\u00a015 GB<\/p>\n<p>-rw&#8212;&#8212;- 1 root root 67108864 dic 28 13:08 local.0<br \/>\n-rw&#8212;&#8212;- 1 root root 16777216 dic 28 13:08 local.ns<br \/>\n-rwxr-xr-x 1 root root 6 dic 28 13:08 mongod.lock<br \/>\n-rw&#8212;&#8212;- 1 root root 67108864 dic 28 13:33 perfil.0<br \/>\n-rw&#8212;&#8212;- 1 root root 134217728 dic 28 13:21 perfil.1<br \/>\n-rw&#8212;&#8212;- 1 root root 268435456 dic 28 13:23 perfil.2<br \/>\n-rw&#8212;&#8212;- 1 root root 536870912 dic 28 13:26 perfil.3<br \/>\n-rw&#8212;&#8212;- 1 root root 1073741824 dic 28 14:07 perfil.4<br \/>\n-rw&#8212;&#8212;- 1 root root 2146435072 dic 28 13:56 perfil.5<br \/>\n-rw&#8212;&#8212;- 1 root root 2146435072 dic 28 13:56 perfil.6<br \/>\n-rw&#8212;&#8212;- 1 root root 2146435072 dic 28 14:07 perfil.7<br \/>\n-rw&#8212;&#8212;- 1 root root 2146435072 dic 28 14:13 perfil.8<br \/>\n-rw&#8212;&#8212;- 1 root root 2146435072 dic 28 14:13 perfil.9<br \/>\n-rw&#8212;&#8212;- 1 root root 16777216 dic 28 14:12 perfil.ns<br \/>\ndrwxr-xr-x 2 root root 6 dic 28 14:07 _tmp<\/p>\n<blockquote><p>[root@linuxlibre mongo]# du -h<br \/>\n2.0G .\/journal<br \/>\n0 .\/_tmp<\/p><\/blockquote>\n<p><code><br \/>\n[root@linuxlibre nombres]# du -h<br \/>\n15G<\/code><\/p>\n<p><strong>Gasto de Disco duro por MySQL con motor MyISAM<\/strong><\/p>\n<p><strong>El comando para importar el archivo<\/strong><\/p>\n<p><code>mysqlimport --delete --fields-terminated-by=',' --fields-escaped-by='\\' --lines-terminated-by='\\n' --local --lock-tables --verbose nombres \/root\/perfil.txt<\/code><\/p>\n<p>El tiempo de la importaci\u00f3n fue<\/p>\n<p>real 3m37.700s<br \/>\nuser 0m0.113s<br \/>\nsys 0m0.433s<\/p>\n<p>El consumo de disco duro de la importaci\u00f3n termina con\u00a02.4 GB<\/p>\n<p>-rw-rw&#8212;- 1 mysql mysql 65 dic 28 17:43 db.opt<br \/>\n-rw-rw&#8212;- 1 mysql mysql 8590 dic 28 18:21 perfil.frm<br \/>\n-rw-rw&#8212;- 1 mysql mysql 1483647080 dic 28 18:25 perfil.MYD<br \/>\n-rw-rw&#8212;- 1 mysql mysql 1071191040 dic 28 18:25 perfil.MYI<\/p>\n<p><code>[root@linuxlibre nombres]# du -h<br \/>\n2.4G<\/code><\/p>\n<p><strong>El resultado de consumo de disco duro es<\/strong><\/p>\n<p>MongoDB 15 GB, MySQL 2.7 GB<br \/>\nTiempo de importaci\u00f3n MongoDB 52 Min, MySQL menos de 4 Minutos.<\/p>\n<p>Desde aqu\u00ed ya se puede ver una clara ventaja en MySQL clar\u00edsima si tomamos en cuenta la diferencia de tiempo y espacio ocupado en disco duro de un archivo fuente \u00a0que no exced\u00eda 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\u00eda una paliza a MySQL pens\u00e9 que tener un gasto de 15GB habr\u00eda sido para acomodar la informaci\u00f3n de tal manera que al realizar una consulta esta seria INMEDIATA. Pero no fue as\u00ed, otros programadores me hicieron ver que estaba usando MongoDB sin \u00edndices, pero tambi\u00e9n estaba usando a MySQL MyISAM sin \u00edndices, a puro select * from y where. Por lo que la comparaci\u00f3n segu\u00eda siendo justa, al agregarle \u00edndices a MongoDB esta empez\u00f3 a funcionar de manera m\u00e1s eficaz de forma superior a MySQL, pero no ser\u00eda una comparaci\u00f3n justa, MySQL no estaba usando \u00edndices, as\u00ed que le agregue \u00edndices<\/p>\n<p><strong>Creando el \u00edndice con MongoDB<\/strong><\/p>\n<p><code><br \/>\n&gt; db.perfil.createIndex({\"nombre\" : \"text\"})<br \/>\n{<br \/>\n\"createdCollectionAutomatically\" : true,<br \/>\n\"numIndexesBefore\" : 1,<br \/>\n\"numIndexesAfter\" : 2,<br \/>\n\"ok\" : 1<br \/>\n}<\/code><\/p>\n<p>\u2022\u00a0\u00a0 \u00a0Aqu\u00ed des afortunadamente MongoDB no regresa el tiempo que le toma construir el \u00edndice, pero fueron aproximadamente 10 minutos, tal vez m\u00e1s.<\/p>\n<p><strong>Creando los \u00edndices en MySQL MyISAM<\/strong><\/p>\n<p><code>MariaDB [nombres]&gt; Create FULLTEXT INDEX nombre ON perfil (nombre);<br \/>\nQuery OK, 100182354 rows affected (3 min 31.83 sec)<br \/>\nRecords: 100182354 Duplicates: 0 Warnings: 0<\/code><\/p>\n<p>Tiempo para crear el \u00edndice menos de 4 minutos.<\/p>\n<p><strong>Prueba de rendimiento<\/strong><\/p>\n<p>Finalmente hice un programa para consultar MongoDB y otro para MySQL, la diferencia del c\u00f3digo radica en las l\u00edneas de conexi\u00f3n, pero la consulta prentende ser la misma e igualmente fueron medidas.<\/p>\n<p><strong>C\u00f3digo fuente del programa para consulta de MongoDB<\/strong><\/p>\n<p><code>&lt;?php<\/p>\n<p>try<br \/>\n{<br \/>\n$conn = new MongoClient();<br \/>\n$db = $conn-&gt;selectDB(\"perfil\");<br \/>\n$col = $db-&gt;selectCollection(\"NOMBRE\");<\/p>\n<p>}<br \/>\ncatch(Exception $e)<br \/>\n{<br \/>\necho $e;<br \/>\n}<br \/>\n$query = array('$text'=&gt;array('$search' =&gt; $argv[1]));<\/p>\n<p>$consulta = $col-&gt;find($query);<\/p>\n<p>$c = 0;<br \/>\nwhile ($consulta-&gt;hasNext()) {<br \/>\n$e = $consulta-&gt;getNext();<br \/>\necho $e[\"NOMBRE\"].\"\\n\";<br \/>\n$c++;<br \/>\n}<br \/>\necho \"Registros encontrados $c \\n\";<br \/>\n?&gt;<\/code><\/p>\n<p><strong>C\u00f3digo fuente del programa de MySQL<\/strong><\/p>\n<p><code>&lt;?php<\/p>\n<p>include (\"phpdbmodel.php\");<\/p>\n<p>$db = new phpdbmodel();<br \/>\n$db-&gt;host = \"localhost\";<br \/>\n$db-&gt;db = \"nombres\";<br \/>\n$db-&gt;driver = \"mysql\";<br \/>\n$db-&gt;user = \"root\";<\/p>\n<p>$db -&gt; connect();<\/p>\n<p>\/\/ $consulta = $db-&gt;Find(\"nombre\",\"LORENA\");<\/p>\n<p>$consulta = $db-&gt;Query (\"select nombre from perfil where MATCH (nombre) AGAINST ('$argv[1]' IN BOOLEAN MODE);\");<\/p>\n<p>$c = 0;<\/p>\n<p>foreach ($consulta as $e)<br \/>\n{<br \/>\necho $e[\"nombre\"].\"\\n\";<br \/>\n$c++;<br \/>\n}<\/p>\n<p>echo \"Registros encontrados $c \\n\";<br \/>\n?&gt;<\/code><\/p>\n<p>Llegado a este punto la demostraci\u00f3n ya no ser\u00e1 en texto, ser\u00e1 en v\u00eddeo para poder mostrar el rendimiento al hacer consultas en ambas bases de datos, para m\u00ed el ganador indiscutible es MySQL \/ MariaDB, pero ustedes pueden realizar sus propias pruebas y sacar sus propias conclusiones.<\/p>\n<p><strong>Video de rendimiento My]SQL vs MongoDB<\/strong><\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/Yvi-JwR3Nn0\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Despu\u00e9s que escrib\u00ed el art\u00edculo sobre Armageddon by Megabyte, un amigo me hizo notar que la DB correcta para esa misi\u00f3n habr\u00eda sido MongoDB y me comparti\u00f3 el siguiente el siguiente link http:\/\/skaruz.com\/en\/2012\/01\/mongodb-vs-mysql-myisam-and-innodb-performance-comparison\/ Esta comparaci\u00f3n fue hecha por Grzegorz Skaruz un desarrollador con unas credenciales muy impresionantes seg\u00fan linkedin lo primero que note al ver&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1613,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-1612","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-en-la-opinion-de"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1612"}],"version-history":[{"count":5,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1612\/revisions"}],"predecessor-version":[{"id":1618,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1612\/revisions\/1618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/media\/1613"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}