Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/11/2010, 08:28
santa
 
Fecha de Ingreso: octubre-2008
Mensajes: 75
Antigüedad: 15 años, 6 meses
Puntos: 1
MySQL 5 vs PostgreSQL 9 el verdadero test

Estimados estoy por desarrollar un sistema el cual espero tenga un buen futuro y para eso necesito una buena base de datos.

Pero hace poco tuve que hacer unos trabajos con una base ya consolidada en PostgreSQL 8.1 y he tenido que ver muchos aspectos de PostgreSQL. Lo que puedo decir rápidamente es que es una excelentísima base de datos
la cual tiene muchísimas mas cosas que MySQL, posiblemente por que hace mas tiempo que esta siendo programada. Algunas de las cosas que he visto por ejemplo es el tema de SCHEMAS que podría decirse que es como una sub base de datos dentro de una principal, o también puedo decir que es como una contenedora de tablas
Yo toda la vida he usado MySQL pero en un nuevo trabajo donde me he estado usan PostgreSQL 8.1. con una base de datos muy grande.

Voy a tratar de ser lo mas imparcial posible por lo tanto inicialmente diría que no se pueden comparar de igual a igual estas dos bases de datos, ya que yo diría que son para distintos segmentos. A que me refiero con esto, el tema es que PostgreSQL es una base de datos mas rica en robustez y cuando digo robustez no me estoy refiriendo a que puede manejar mas datos o que en mysql voy a perder algo sino que PostgreSQL tiene aspectos que todavía mysql no lo contempla como por ejemplo los SCHEMAS, el CHECK de una columna para no meter cualquier dato, las secuencias que en mysql son autoincrements, name spaces y lo mas lindo de todo la programación PL en donde puedo programar en PL o python, java y otros también.

Por el otro lado MySQL en que podrá ser mejor... bueno hace mucho tiempo que se viene diciendo que mysql es mas rápido que postgresql el tema es, hoy por hoy lo sigue siendo? por que mysql era rápido con las tablas Myisam pero con innodb? que podemos decir?, por el otro lado postgresql cada vez dicen que es mas rápido, entonces ahora seran iguales?. Este es el punto a analizar, si bien mysql no le gana a postgresql en la complejidad y administración de datos por lo arriba mencionado, seria ver si en velocidad si gana.

Para saciar mi intriga rápidamente he hecho una pequeña prueba inicial con lo que tenia a mano. Este primer test es uno rápido para ver resultados de forma rápida pero prometo uno de gran escala donde aca es donde pido la colaboración de la gente de postgres y la de mysql para que cada uno opine que prueba hacer en conjunto. Lo testeado fue bajo una computadora de escritorio Athlon 2800 que corre a 2.0ghz con 1gb de ram, sistema operativo Ubuntu 9.10 y disco sata, la tabla:

Código MySQL:
Ver original
  1. +--------------------+----------+------+-----+---------+----------------+
  2. | Field              | Type     | Null | Key | Default | Extra          |
  3. +--------------------+----------+------+-----+---------+----------------+
  4. | transporte_id      | int(10)  | NO   |     | NULL    |                |
  5. | tipo_transporte_id | int(1)   | NO   |     | NULL    |                |
  6. | id_chofer          | int(10)  | NO   |     | NULL    |                |
  7. | fecha_hora         | datetime | YES  |     | NULL    |                |
  8. | user_id            | int(4)   | YES  |     | NULL    |                |
  9. | mensaje_cod        | int(10)  | YES  |     | NULL    |                |
  10. | id                 | int(11)  | NO   | PRI | NULL    | auto_increment |
  11. +--------------------+----------+------+-----+---------+----------------+

dicha tabla fue llenada con un proceso de php el cual cargaba los campos con cadenas aleatorias por medio de random con el fin de llenar con datos. Los primeros 10 registros se cargaron asi:

Código MySQL:
Ver original
  1. +-----------------+--------------------+---------------+---------------------+---------+---------------+----+
  2. | transporte_id   | tipo_transporte_id | id_chofer     | fecha_hora          | user_id | mensaje_cod   | id |
  3. +-----------------+--------------------+---------------+---------------------+---------+---------------+----+
  4. |        99723312 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      71714855 |  1 |
  5. |        44066646 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      41812736 |  2 |
  6. |        95105573 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      70944188 |  3 |
  7. |        39528330 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      61580575 |  4 |
  8. |        55750701 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      83530388 |  5 |
  9. |         4539456 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      97842664 |  6 |
  10. |        44997693 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      28547121 |  7 |
  11. |        87048772 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      18199467 |  8 |
  12. |        84745003 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      74514718 |  9 |
  13. |        72368643 |                  1 |             0 | 2010-11-09 12:56:15 |       2 |      10890136 | 10 |
  14. +-----------------+--------------------+---------------+---------------------+---------+---------------+----+

De esta manera llegue a cargar

Código MySQL:
Ver original
  1. +-----------+
  2. | count(*)  |
  3. +-----------+
  4. | 275079589 |
  5. +-----------+

Si dos cientos setenta y cinco millones setenta y nueve mil quinientos ochenta y nueve datos, no se si sera mucho pero no algo que se vea avitualmente. con estos datos hice inicialmente un par de pruebas, ojo toda esta data esta en mysql 5.0 y del otro lado tengo a postgres 8.1 con 980.000 datos, con similares tablas y un servidor similar.

El primer query que tire fue un count(*) el cual la primera vez que lo tire en mysql fue de s0,08 menos de un segundo (275 millones de datos) y en postgres 7 segundos. Luego volví a tirar el mismo query para ver como cacheaba donde mysql me devolvió s 0,00 segundos y postgres jamas bajo de 4 segundos, ojo no se olviden de la cantidad de datos que es algo diferente por no decir abismal.

Viendo esto que es increíble en su diferencia es que me propuse montar el ultimo mysql y el ultimo postgres y armar las mismas tablas para que se le puedan cargar la misma cantidad de datos, mi idea es 500 millones o si me alcanza el disco 1.500 millones de registros.

Lo que se probara es lo siguiente

count(*)
select like '%algo%' de un campo no indexado
select like '%algo%' de un campo indexado pero no como campo único
select a un ide donde el id este indexado y sea único
select where id in() trayendo muchos registros
select con un join entre dos tablas

Todos estos se harán primero con mysql y luego con postgres, iniciando la maquina de 0 para que la memoria no perjudique a ninguno de los dos. Además cada una de las consultas se tiraran 3 veces para ver cuanto tarda inicialmente y luego dos mas para ver como vuelve a traer los datos cuando ya están cacheados.



Bueno espero que les guste mi propuesta y que me tiren ideas para agregar a la prueba, esperare unos días para ver si alguien tira algo bueno, mientras yo voy cargando los datos por que lleva tiempo, saludos y estamos en contacto.




Santa

Última edición por santa; 11/11/2010 a las 14:39