lunes, 18 de noviembre de 2013

MySql vs PostgreSql, porque no restarle importancia al elegir.

Como programadores, es común no darle mucha importancia al motor que gestionara nuestra base de datos, pero la verdad es que este es un punto tan critico e importante que puede hacer que nuestros desarrollos especialmente los mas grandes y complejos se vuelvan una pesadilla en temas de desempeño y escalabilidad.

En desarrollos que tienen altas consultas a la base de datos y/o volúmenes de datos grandes, así como una gran complejidad en dichas consultas, el tema de elegir el motor de nuestra base de datos cobra especial relevancia. Si bien tema del diseño de la base también es critico, aquí solo tocaremos el tema de la elección del motor, en esta ocasión entre el famoso MySql y uno menos conocido pero no por ello malo si no todo lo contrario, hablamos del Oracle de código abierto, PostgreSql.


Muy poco de historia.


MySql.


Es un motor muy popular y que casi todos sabemos su historia al menos de forma muy espartana pero la conocemos, sabemos que fue comprada por Sun y posteriormente por Oracle y que bajo su sombra "gran cosa no ha crecido" o no como muchos esperaríamos y la perdida de usuarios a ultimas fechas demuestra que esta cayendo de la gracia de muchos. Aunque algunos le tenemos aun cariño porque probablemente fue el primer motor de base de datos con el que tuvimos contacto, así que hay sentimientos involucrados para muchos.


PostgreSql.


Es un motor muy antiguo, que se le puede seguir la pista hasta principios de la década de los 80's, mas viejo que yo así es. Con una historia interesante donde empresas han ido y venido intentado beneficiarse de este motor, pero PostgreSql se ha mantenido incólume ante el despiadado paso de los años que sabemos que en esta industria se mueven como huracanes y nada esta garantizado ni siquiera por algunos años, pero ahí esta viendo pasar los años XD, la verdad es que si ha crecido y ganado mucha madurez.


Aclarar un punto.


Antes de seguir, debemos de estar conscientes de que en el mercado de gestores de base de datos, existen dos "ligas" las grandes y las menores, donde se mueven todos los gestores habidos y por haber, en las menores tenemos por ejemplo a Sqlite y en las mayores a Oracle, Microsoft Sql Server y a PostgreSql, MySql empezó en las ligas menores y ahora esta queriendo meterse en las grandes. Pues hora del enfrentamiento, que empiece la batalla.


Características.


MySql


- modelo relacional.

- multiple soporte a sistemas operativos (windows, linux, mac, unix, bsd, symbian, amigaos, etc)
- licencia GPL
- control de acceso (Native Network Encryption, patch access, run unprivileged)
- indices (full-text, hash, r-/r+ tree)
- particionado (compuesto rango + hash, hash, lista, rango)
- procedimientos almacenados
- triggers
- cursores
- soporta inner joins, inner selects, merge joins, outer joins, union
- ACID
- Integridad referencial
- Transacciones
- Agrupacion de transacciones
Uso de multihilos mediante hilos del kernel.
hasta 64 índices por tabla
- replicacion
Uso de multihilos mediante hilos del kernel
- soporte a estandar SQL
- tablas temporales
- vistas

PostgreSql


- modelo objeto relacional

- soporte a multiples sistemas operativos (windows, linux, mac y bsd) menos que en mysql
- licencia GPL
- Control de acceso (audit, brute-force protection, enterprice directory compatibility, native network encryption, password complexity rules, patch access, resource limit, run unprivileged, security certificacion)
- indices (bitmap, expresion, full-text. gin, gist, hash, partial, r-/r+ tree, reverse) notar que tiene la capacidad de indexar sobre tipos de datos creados por el usuario.
- particionado (compuesto rango + hash, hash, lista, native replication, rango, shadow)
- procedimientos almacenados. 
- funciones (soporta funciones en segundo plano)
- triggers
- cursores
- soporta inner joins, inner selects, merge joins, outer joins, union, intersects, excepts, windowing functions
- ACID
- Integridad referencial
- Transacciones
- transacciones distribuidas (Permite a PostgreSQL integrarse en un sistema distribuido formado por varios recursos)
- funciones personalizadas
- alta concurrencia (Mediante un sistema denominado MVCC (Acceso concurrente multiversión, por sus siglas en inglés) PostgreSQL permite que mientras un proceso escribe en una tabla, otros accedan a la misma tabla sin necesidad de bloqueos. Cada usuario obtiene una visión consistente de lo último a lo que se le hizo commit. Esta estrategia es superior al uso de bloqueos por tabla o por filas común en otras bases, eliminando la necesidad del uso de bloqueos explícitos)
- altamente escalable, al mometo de expandir el hardware y usar muchos servidores de bases de datos postgreSql le aventaja a MySql.
- Herencia de tablas
- commits asíncronos
- backups en caliente (no es necesario detener el servicio)
- plantillas
- replicacion, aunque en este tema lleva ventaja sobre de MySql, ya que muestra mejor rendimiento en sistemas grandes
- procesamiento paralelo
- soporte a estandar SQL 
- tablas temporales
- vistas
- querys paralelos (muy bueno)
- tipos de datos geométricos y monetarios
- Roles

Rendimiento.


Si bien, MySql muestra un mejor rendimiento que PostgreSql en cuanto a consultas simples se refiere (siendo realistas difícilmente una aplicación medianamente compleja solo tendrá consultas simples) en cuanto se trata de consultas complejas con muchas tablas involucradas, toma ventaja PostgreSql, incluso MySql llega a presentar problemas para resolver ciertas consultas (no se si sea un bug) pero tuve una ocasión donde simplemente MySql (hace algunos días, obviamente con la ultima versión) no pudo resolver una consulta, pasaban los minutos y nada, no fue hasta que indexe las tablas involucradas que pudo resolver la consulta, caso contrario con PostgreSql que la resolvió en segundos y sin indexar tablas. Mirando por Internet leí un blog de alguno al que la paso algo parecido donde su consulta tardo mas de 40 minutos! y no fue hasta que indexo que pudo resolver su problema, este tipo de cosas dejan mal parado a MySql.


Un punto final.


Quiero esgrimir un argumento que tal vez no sea muy valido, pero yo creo que MySql bajo la sombra de Oracle no ha crecido y no lo va hacer, ¿porque? simple... se llama "conflicto de intereses" ¿quien es el mayor vendedor de bases de datos del mundo? así es, es Oracle! ¿de verdad piensan que va a dejar que rebase a su producto estrella?. El que exista una versión community no significa que quien tenga la sarten por el mango sea la comunidad, es Oracle quien tiene la ultima palabra, seguramente esto ha provocado un malestar y resultado de esto la desbandada de desarrolladores que antes agrupaba MySql y que han iniciado nuevos proyectos o unido a otros como son MongoDB y MariaDB, sin ir mas lejos el mismísimo creador de MySql inicio MariaDB, texto tomado de wikipedia "Monty decidió crear esta variante porque estaba convencido de que el único interés de Oracle en MySQL era reducir la competencia que MySQL daba al mayor vendedor de bases de datos relacionales del mundo que es Oracle". Al fin! no soy el único que piensa esto. Así que sin ser pesimistas, yo la verdad no lo usuaria en un proyecto de largo plazo.


Conclusión.


Con solo ver la tabla de características se puede ver quien juega en la liga mayor y quien si bien ya no esta en las menores aun NO se puede decir que esta en las grandes, en el tema de rendimiento están muy parejos, ya que MySql al querer meterse en las grandes ligas a sacrificado rendimiento por mayor robustez haciendo que las ultimas versiones consuman mas memoria RAM y procesador. En cambio PostgreSql a ultimas fechas se ha enfocado a mejorar el rendimiento y facilidad de uso para los desarrolladores, en el apartado de escalabilidad es sabido que lleva mas madures PostgreSql, aunque MySql no se queda muy atrás.


Finalmente dado que un gestor de base de datos no solo es desempeño y menos cuando se trata de desarrollos grandes, el claro ganador es PostgreSql.


Saludos y hasta la próxima, espero sea de su utilidad, si andan un poco confusos con este tema.




1 comentario:

  1. Pregunta, el código de PostgreSQL es de oracle ? tengo entendido que el código de oracle es el de mysql.

    ResponderEliminar