Para poner a prueba la capácidad de las bases de datos con MySQL, vamos a evaluar la capacidad y rapidez de acceso en la búsqueda de datos dentro de la misma.
Este experimento se basa en conocer cuál es la mejor manera de distribuir la información para que las búsquedas sean más rápidas. Muchas aplicaciones distribuyen la información en una sola tabla, realizando búsquedas entre millones de registros. Según el tipo de búsqueda puede ser más o menos accesible pero se debe crear una referencia para asegurar una rapidez en la búsqueda de información. O si no que se lo digan a los buscadores.
Para ello vamos a aprender a crear una tabla con millones de registros creando una rutina en un bucle.
Antes de nada hay que establecer las bases del experimento. En primer lugar, se necesita acceder a un cliente MySQL con todos los privilegios habilitados; esto es necesario para crear rutinas MySQL. Si accedemos a un servidor remoto, aunque paguemos por él, lo más seguro es que este capado y no se dispongan de los privilegios para crear estas rutinas. Y con razón. Es por ello que haremos las pruebas desde el ordenador personal con nuestro MySQL ya instalado.
En segundo lugar debemos tener instalado MySQL Client que nos ofrece un terminal para ejecutar las instrucciones de estas rutinas y hacer un análisis de tiempos.
Despues de familiarizarnos con la ejecución de algunos comandos MySQL dentro de su terminal, procederemos a crear la siguiente tabla.
CREATE SCHEMA IF NOT EXISTS `millionDB` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE `millionDB` ; -- ----------------------------------------------------- -- Table `millionDB`.`Table10M` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `millionDB`.`Table10M` ( `ID` INT NOT NULL AUTO_INCREMENT COMMENT '', `lat` DECIMAL NULL COMMENT '', `lng` DECIMAL NULL COMMENT '', PRIMARY KEY (`ID`) COMMENT '') ENGINE = InnoDB;
La tabla contiene un campo autoincremental que será la clave primaria y dos campos adicionales que se llaman lat y lng, simulando que son las coordenadas de latitud y longitud y nuestras búsquedas se basarán en buscar los puntos cercanos.
En esta tabla se haran distintas pruebas con distinto número de registros en ellas. Para ello se asociarán una rutina de 10 millones de registros, 20, 50, 100 y 500 millones.
Para hacerse una idea, 10 millones de registros con dos campos corresponden a unos 350 MB de información. Aunque también depende del tipo de dato a almacenar (en este caso un float). Si extendemos esta información a petabytes de información podríamos hablar de Big Data, pero tranquilos que para un ordenador de casa, aún nos costará un rato.
Vamos a crear unas rutinas para introducir valores en los registros.
-- ----------------------------------------------------- -- procedure Routine10M -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `Routine10M` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=10000000 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ; -- ----------------------------------------------------- -- procedure Routine20M -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `Routine20M` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=20000000 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ; -- ----------------------------------------------------- -- procedure Routine50M -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `Routine50M` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=50000000 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ; -- ----------------------------------------------------- -- procedure Routine100M -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `Routine100M` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=100000000 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ; -- ----------------------------------------------------- -- procedure Routine500M -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `Routine500M` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=500000000 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ; -- ----------------------------------------------------- -- procedure test100 -- ----------------------------------------------------- DELIMITER $$ CREATE PROCEDURE `test100` () BEGIN DECLARE counter BIGINT DEFAULT 0; my_loop: LOOP SET counter=counter+1; INSERT INTO `millionDB`.`Table10M` ( `lat`, `lng`) VALUES ( RAND()*100, RAND()*100); IF counter=100 THEN LEAVE my_loop; END IF; SELECT counter; END LOOP my_loop; END $$ DELIMITER ;
Una vez creadas las rutinas solamente tenemos que llamar a cada una de ellas para que vayan llenando con millones de valores aleatorios las tablas. Comenzaremos con la del teste de prueba y NO prosigamos a hacer ninguna más.
CALL PROCEDURE `millionDB`.`test100`;
Este método de 100 no nos va a dar ningún problema, se ejecutarán los 100 registros de una forma relativamente rápida, pero hay que comentar que este método, cuesta sospechosamente bastante.
Para hacerse una idea y dependiendo del ordenador, introducir 1000 registros cuesta 1 minuto. Así que si ejecutamos las siguientes rutinas; como la de Routine10M, habría que esperar 10000 minutos para introducir 10 millones de registros y eso son 166 horas o 7 días. Y esto es una pérdida de tiempo colosal.
En cambio si se introducen los registros desde un csv o un archivo de texto, esta tarea cuesta muchisimo menos; así que vamos a tirar a la basura esta metodología; y en el próximo post explicaremos la manera de llevar a cabo lo mismo por otra vía; porque esta una perdida de tiempo. Si acaso se puede utilizar para casos concretos, pero en absoluto se debe utilizar para introducir grandes cantidades de datos.
One comment