Ver Mensaje Individual
  #13 (permalink)  
Antiguo 12/01/2011, 09:22
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: MySQL 5 vs PostgreSQL 9 el verdadero test

Como lo prometido es deuda, otra vez estoy por aca.

propongo el siguiente laboratorio.

Se tiene la misma tabla para postgresql y mysql.

tabla en postgres
Código SQL:
Ver original
  1. CREATE TABLE t_prueba_velocidad
  2.                        (campo1 serial PRIMARY KEY,
  3.                         campo2 INTEGER,
  4.                         campo3 DATE
  5.                        );

tabla en mysql
Código MySQL:
Ver original
  1. CREATE TABLE t_prueba_velocidad
  2.                        (campo1 integer primary key auto_increment,
  3.                         campo2 integer,
  4.                         campo3 date
  5.                       );

Con esta función en postgresql se generan numeros aleatorios entre rangos establecidos.
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION random(NUMERIC, NUMERIC)
  2. RETURNS NUMERIC AS
  3. $$
  4.    SELECT ($1 + ($2 - $1) * random())::NUMERIC;
  5. $$ LANGUAGE 'sql' VOLATILE;

y con esta se llena la tabla con 500'000,000 de registros.

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION llenar_tabla_masiva()
  2.   RETURNS text AS
  3. $BODY$
  4. DECLARE
  5. contador INTEGER;
  6. BEGIN
  7. FOR contador IN 1..500000000 LOOP
  8.  INSERT INTO t_prueba_velocidad (campo2,campo3) VALUES(random(100000,999999)::INTEGER,now());
  9. END LOOP;
  10. RETURN 'LISTO'::text;
  11.  
  12. END;
  13. $BODY$
  14.   LANGUAGE 'plpgsql' VOLATILE
  15.   COST 100;

En mysql con esta función se llenan los mismos 500'000,000 de registros.

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE FUNCTION llenar_tabla_masiva() RETURNS VARCHAR(50)
  4.  DECLARE contador INTEGER;    
  5.  DECLARE mensaje VARCHAR(50);
  6.  
  7.  SET contador=0;
  8.  SET mensaje='LISTO';
  9.   WHILE contador < 500000000 DO    
  10.      INSERT INTO t_prueba_velocidad (campo2,campo3) VALUES((100000 + ROUND(RAND() * (999999 - 100000))),now());  
  11.      SET contador = contador + 1;
  12.   END while;
  13.  
  14. RETURN mensaje;
  15. END$$
  16. DELIMITER ;

Ambos ambientes cuentan con 3 campos, con los mismos tipos de datos y un indice creado con la primary key.
El segundo campo se genera de forma aleatoria un numero entero entre 100000 y 999999.

en estos momentos tengo corriendo la función en postgresql llenando la tabla. El hardware de mi maquina es una workstation dell con 4 nucleos y 4 GB de memoria RAM.
Ya me llegó un server con 16 GB de ram y 6 nucleos pero mientras instalo sistemas operativos y configuro servicios puede pasar un buen rato. Cuando lo tenga listo, podemos comprobar que tanto afecta la memoria ram en el rendimiento.

Santa (O cualquier usuario interesado)... la idea sería que crearas esta tabla en tu servidor mysql y corrieras la función. Cuando la tabla esté llena, podemos empezar a comparar tiempos de respuesta de ambos motores a las consultas que citaste en tu primer post.

Si tienes una maquina mas potente la cual también cuenta con postgresql puedes correr ambos ambientes y darnos tus resultados, para que no saquemos excusas que la maquina influyó bastante los tiempos de respuesta. La versión de postgresql que tengo el proceso es la 8.4.

saludos y atento a la respuesta.

EDITO: En la misma maquina he instalado mysql y he corrido la función de llenado. De esta forma, todas las pruebas son bajo el mismo hardware. El proceso en postgresql se demoró 6.2 horas en llenar... esperemos el tiempo de llenado de mysql
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 13/01/2011 a las 09:24