{"id":1604,"date":"2015-12-26T23:18:42","date_gmt":"2015-12-27T05:18:42","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1604"},"modified":"2015-12-26T23:22:05","modified_gmt":"2015-12-27T05:22:05","slug":"armageddon-2-6-por-megabyte-optimizando-una-db-de-millones-de-registros-con-mariadb-o-mysql","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1604","title":{"rendered":"Armageddon 2.6 por Megabyte \u2013 Optimizando una DB de millones de registros con MariaDB o MySQL"},"content":{"rendered":"<p>En un v\u00eddeo de publicado por Ra\u00fal aka Megabyte titulado atacando al atacante, se muestra al final una herramienta privada a la que denomino Armageddon, yo hab\u00eda o\u00eddo de esta herramienta hace unos a\u00f1os. Pero no la conoc\u00eda de primera mano mi la hab\u00eda visto operar.<\/p>\n<p><strong>Conclusiones.<\/strong><\/p>\n<p>Dicen que no se debe hablar mal de la memoria de los finados, pero me ha decepcionado mucho, todo parece indicar que la herramienta fue programada con Visual Basic 6 lenguaje obsoleto desde inicios del nuevo siglo, nadie deber\u00eda usar Visual Basic 6 pasado el a\u00f1o 2000<\/p>\n<p>Me queda claro que fuera de las habilidades de intrusi\u00f3n le faltaba mucho de programaci\u00f3n y ya ni hablar de la estructuraci\u00f3n de una base de datos, m\u00e1s que criticar a Ra\u00fal, el Armageddon que hizo me da la oportunidad de mostrar como optimizar una DB de casi 100 millones de registros en una forma usable con una respuesta casi inmediata y eso ser\u00e1 mi foco central en el art\u00edculo es <em>MySQL y MariaDB pueden con el trabajo.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista1.jpg\" alt=\"MySQL MariaDB Millones de registros\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista1.jpg\">Ver mas grande<\/a><\/p>\n<p>Se puede ver en las im\u00e1genes que para hacer una consulta debe desplegar una lista y seleccionar un estado, incluso en la lista se ve que el DF esta fraccionado en DF1 , DF 2 y DF 3<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista2.jpg\" alt=\"MySQL MariaDB Millones de registros\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista2.jpg\">Ver mas grande<\/a><\/p>\n<p>En esta otra imagen se ve c\u00f3mo tiene que seleccionar una opci\u00f3n de b\u00fasqueda si ser\u00e1 solo por nombre, por nombre y apellido paterno o nombre completo, eso es totalmente impr\u00e1ctico en la l\u00f3gica del programa por c\u00f3digo debe estar implementado cual ser\u00e1 el medio de b\u00fasqueda de acuerdo al estado de los textbox por ejemplo de apellido materno, no pareciera que fuera muy dif\u00edcil condicionar a que si el textbox esta vac\u00edo internamente se interprete como que no podr\u00e1 buscar por apellido materno<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista3.jpg\" alt=\"MySQL MariaDB Millones de registros\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/armaglista3.jpg\">Ver mas grande<\/a><\/p>\n<p>Es hasta el segundo intento que logra encontrar a la persona en la lista de DF 2, una pregunta m\u00e1s interesante seria, que pasar\u00eda si no conoce el estado en el que radica la persona que est\u00e1 buscando, tendr\u00eda que ir recorriendo el scroll de su lista de estado uno por uno y as\u00ed hasta lograr encontrar a la persona, suena como la cosa m\u00e1s impr\u00e1ctica del mundo, para ser una herramienta privada hecha por un hacker y usada por un hacker suena absurdo.<\/p>\n<p>Finalmente puedo concluir que el archivo de la base de datos es un rid\u00edculo Microsoft ACCESS , yo preferir\u00eda usar SQLite o BDB antes que usar Access. Sin saber puedo deducir que de hecho era un archivo Access por cada estado<\/p>\n<p><strong>\u00bf Que har\u00eda Last Dragon ?<\/strong><\/p>\n<p>Lo que hice fue ir a la Deep WEB encontr\u00e9 una copia en archivo de texto de la DB que usa Armageddon el archivo pesa 23 GB y est\u00e1 separado por comas, el cual es muy impr\u00e1ctico porque algunos campos internos usan otro car\u00e1cter para usar las comas por ejemplo MEXICO\u2019DF en lugar de M\u00e9xico, DF debido a que la coma se us\u00f3 como separador de columnas<\/p>\n<p>Ya con el archivo de texto cre\u00e9 una DB a la que llame INE asumiendo que el archivo es una copia del INE aunque no lo pude confirmar, aunque usar INE como nombre hace que el nombre se vea m\u00e1s dram\u00e1tico.<\/p>\n<p>Procese el archivo con mysqlimport pas\u00e1ndole lo par\u00e1metros necesarios como delimitador de columna, de l\u00ednea, etc, etc. Termine con una tabla gigantesca con motor InnoDB, muy buen motor para integridad relacional en MySQL pero p\u00e9sima idea para una DB de solo consultas<\/p>\n<p>La convert\u00ed a MyISAM debido a que con este motor no me da integridad relacional sino procesamiento r\u00e1pido de \u00edndices en cada QUERY que es justamente lo que necesito para el laboratorio de este articulo.<\/p>\n<p>Al terminar ten\u00eda una tabla gigantesca MyISAM de 90 millones de registros seg\u00fan en la Deep WEB es la informaci\u00f3n de m\u00e1s del 90% de la poblaci\u00f3n en M\u00e9xico, debe ser cierto porque me encontr\u00e9 a m\u00ed mismo afortunadamente con una direcci\u00f3n de una casa que rent\u00e9 y no conten\u00eda informaci\u00f3n de mi ultimas residencias que aunque tambien retandas y abandonadas no aparec\u00edan por lo tanto debe estar des actualizada un par de a\u00f1o.<\/p>\n<p>Empec\u00e9 a fragmentar la tabla gigantesca en tablas m\u00e1s peque\u00f1as, aunque MyISAM no permite hacer relaci\u00f3n de llaves for\u00e1neas eso no evita que uno lo intente de forma l\u00f3gica y por cuenta propia, as\u00ed que seccione en 10 tablas, una tabla para el perfil de b\u00fasqueda por nombre y apellidos, otra para el nombre de las calles, otra para las colonias, etc. Todas las tablas fueron relacionadas por una pseudo llave for\u00e1nea , cuando por fin termine. Borre la tabla gigante original qued\u00e1ndome con N cantidad de tablas teniendo como ra\u00edz una tabla llamada perfil<\/p>\n<p>Cualquiera pensar\u00eda que ya esta resuelto, pero no es as\u00ed, hacer una consulta select con un where por nombre y apellidos seria tan malo como lo hace armageddon.<\/p>\n<p>En una DB con tablas que contienen 90 millones de registros hacer un<\/p>\n<p>Select nombre,apaterno,amaterno where nombre = &#8216;Daniel&#8217; and apaterno = &#8216;Romero&#8217;;<\/p>\n<p>Esa sentencia tarda aproximadamente unos 4 minutos en ejecutarse, lo cual es IMPRACTICO y ya ni hablar si en lugar de una condici\u00f3n directa se usa un LIKE; vete por un caf\u00e9 que tomara como 6 minutos.<\/p>\n<p><strong>\u00bf Como se puede consultar tantos millones de registros, MySQL puede con el trabajo ?<\/strong><\/p>\n<p>Claro que puede y le sobra siempre y cuando sepas como estructurar tu DB.<\/p>\n<p>Para afinar la DB yo usar\u00eda \u00edndices FullText.<\/p>\n<p><code>CREATE FULLTEXT INDEX indicenombre ON ine (nombre);<br \/>\nCREATE FULLTEXT INDEX indiceapaterno ON ine (apaterno);<br \/>\nCREATE FULLTEXT INDEX indiceamaterno ON ine (amaterno);<\/code><\/p>\n<p>Se puede agregar el \u00edndice con varios campos, pero para esta soluci\u00f3n, me gusta la idea de un \u00edndice individual en un lugar de uno grupal, por el tama\u00f1o de la DB tomara aproximadamente 5 minutos por cada \u00edndice por el gran tama\u00f1o de la DB, as\u00ed que 15 minutos despu\u00e9s tendremos los 3 \u00edndices. Terminado de crear los indices ya se puede consultar usando los \u00edndices, para usarlos se puede usar 2 m\u00e9todos, b\u00fasqueda tipo LIKE o b\u00fasqueda Booleana. Para este tipo de consulta yo usar\u00eda b\u00fasquedas Booleanas<\/p>\n<p><strong>En el modo Like<\/strong><\/p>\n<p><code>select * from perfil where Match (nombre) AGAINST ('Raul');<\/code><\/p>\n<p>Esta sentencia traer\u00eda a todos los Raules en M\u00e9xico sin importar que tenga 2 nombres, como Ra\u00fal Antonio, o Raul XApellido y cualquier apellido materno y paterno<\/p>\n<p>Para afinar la b\u00fasqueda usar\u00eda el \u00edndice con modo Booleano para encender o apagar palabras<\/p>\n<p><code>select * from perfil where Match (nombre) AGAINST ('+Raul' IN BOOLEAN MODE) and Match (apaterno) AGAINST ('+Robles' IN BOOLEAN MODE) and Match (amaterno) AGAINST ('+Aviles' IN BOOLEAN MODE);<\/code><\/p>\n<p>Este \u00faltimo QUERY le dice a MySQL o MariaDB que usando \u00edndices solo traiga donde coincida el nombre obligatoriamente la palabra Ra\u00fal en apellido obligatoriamente debe tener la palabra Robles y en apellido materno obligatoriamente debe tener avil\u00e9s, con el signo m\u00e1s la volvemos obligatoria, pero con el signo menos seria que obligatoriamente no debe contener la palabra para que se cumpla la condici\u00f3n, el resultado de esta b\u00fasqueda es que traer\u00eda todos los Ra\u00fal Robles Avil\u00e9s en la DB que por cierto en la DB que consegu\u00ed son 2, claro que usando \u00edndices la consulta no tardar\u00eda ni segundo, solo una fracci\u00f3n de segundo en lugar de los 5 minutos que podr\u00eda tomar usando un where sencillo. Tambien se pueden buscar m\u00e1s palabras por columna como (&#8216;+PrimerNombre +SegundoNombre&#8217; IN BOOLEAN MODE) y debe cumplirse la condici\u00f3n de que las 2 palabras est\u00e9n presentes en ese Varchar, Varchar es el tipo de campo que use para esta tabla es m\u00e1s lento que Char pero en una DB con millones de registros usar un Char de tama\u00f1o est\u00e1tico podr\u00eda resultar en un desperdicio de gigabyte en disco duro.<\/p>\n<p>Demostrando la eficiencia de las tablas relacionadas de un MySQL contra el Armageddon hecho en ACCESS y VB6, para eso buscare al mismo Erick Licea y en una fracci\u00f3n de segundo me traer\u00e1 a todos los Erick Licea en M\u00e9xico, incluida la llave primaria ID que me podr\u00eda servir para una segunda QUERY y conseguir m\u00e1s datos, recordando que separe la tabla grande en tablas m\u00e1s peque\u00f1as, pero pseudo relacionadas l\u00f3gicamente. En la imagen hago 2 consultas separadas para que se pueda apreciar la diferencia en segundos y toda la consulta sin tener que seleccionar estados ni fraccionar al DF en 1, 2 o 3<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/ericklicea.jpg\" alt=\"MySQL MariaDB Millones de registros\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/ericklicea.jpg\">Ver mas grande<\/a><\/p>\n<p>Tambi\u00e9n podemos buscar por todos los Ra\u00fal Robles Avil\u00e9s, encuentra 2 y podemos deducir que el del DF es Megabyte<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/raulrobles.jpg\" alt=\"MySQL MariaDB Millones de registros\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/armageddon\/raulrobles.jpg\">Ver mas grande<\/a><\/p>\n<p>Finalmente, si se quisiera hacer una herramienta privada usar\u00eda Java o C#, posiblemente mas Java para hacerlo multi plataforma en el DESKTOP el cual solo ser\u00eda un cliente ligero conectando a la DB MySQL para poblar los campos en la aplicaci\u00f3n o formularios en una p\u00e1gina WEB con Python o PHP<\/p>\n<p>Se que al final me llegaran peticiones sobre la DB que he sacado de la Deep WEB, para el momento de escribir esto ya la hab\u00eda borrado pues no encontr\u00e9 nada \u00fatil que hacer con ella, excepto tal vez presumir que se d\u00f3nde vives, aunque esta informaci\u00f3n sigue estando al alcance de todo el que navegue por la Deep WEB e incluso en Tepito, nuestra privacidad fue violada y hecha p\u00fablica desde que se public\u00f3 a la venta en DVD o CDs en Tepito, que buen trabajo hacen los administradores de los servidores del gobierno, \u00bf que se puede esperar ? estamos hablando de las mismas personas que contrataron Hacker TEAM.<\/p>\n<p>Con lo que he escrito aqu\u00ed puedes hacerte de tu propia copia y optimizarla pr\u00e1cticamente es del dominio p\u00fablico, no es que sea ciencia de cohetes y eso nos devuelve al tema con el que inicie este POST, \u00bf porque Ra\u00fal reconocido como un Hacker escribi\u00f3 un sistema tan malo para encontrar personas ?, tan falto de usabilidad, eso&#8230; Tal vez nunca lo sepamos.<\/p>\n<p>La siguiente liga te lleva al momento del video donde se ve que usa Armageddon 2.6<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=ndFrwoCr9sI&amp;feature=youtu.be&amp;t=20m34s\">Atacando al atacante y encontr\u00e1ndolo con Armageddon<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En un v\u00eddeo de publicado por Ra\u00fal aka Megabyte titulado atacando al atacante, se muestra al final una herramienta privada a la que denomino Armageddon, yo hab\u00eda o\u00eddo de esta herramienta hace unos a\u00f1os. Pero no la conoc\u00eda de primera mano mi la hab\u00eda visto operar. Conclusiones. Dicen que no se debe hablar mal de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1606,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4],"tags":[],"class_list":["post-1604","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultoria-y-manuales","category-hackers-and-tools"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1604","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=1604"}],"version-history":[{"count":1,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1604\/revisions"}],"predecessor-version":[{"id":1605,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1604\/revisions\/1605"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/media\/1606"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}