Postgres vs MySQL

Según la última Developer Survey de Stack Overflow, este año, PostgreSQL le quitó el primer lugar a MySQL, convirtiéndose en la base de datos más admirada y deseada. Los desarrolladores profesionales son más propensos que los que están aprendiendo a programar a usar PostgreSQL (50%) y los que están aprendiendo tienen más probabilidades de usar MySQL (54%).

2023 Stack Overflow Survey - Databases

A medida que Postgres gana más impulso, se vuelve más difícil elegir entre Postgres y MySQL. MySQL sigue siendo probablemente la base de datos de código abierto más popular del mundo por base de instalación.

Mientras que Postgres se posiciona como la base de datos relacional de código abierto más avanzada del mundo.

Con base en nuestra experiencia operativa en ITDO, a continuación te comparto una comparación extensa entre Postgres y MySQL.

Licencia

  • La edición comunitaria de MySQL tiene licencia GPL.
  • Postgres se publica bajo la licencia PostgreSQL, que es una licencia liberal de código abierto similar a las licencias BSD o MIT.

Aunque MySQL adopta GPL, algunas personas todavía están preocupadas de que MySQL sea propiedad de Oracle. También es la razón por la que MariaDB se bifurca de MySQL.

Modelo de conexión

Postgres usa el proceso por conexión donde cada conexión genera un nuevo proceso. MySQL usa subprocesos por conexión donde cada conexión genera un nuevo subproceso. Por lo tanto, Postgres proporciona un mejor aislamiento, por ejemplo, un error de acceso a la memoria no válido solo bloquea un solo proceso en lugar de todo el servidor de la base de datos. Por otro lado, el modelo de proceso consume más recursos. Por lo tanto, para la implementación de producción de Postgres, se recomienda hacer un proxy de la conexión a través de un agrupador de conexiones como PgBouncer o pgcat .

Rendimiento

Para la mayoría de las cargas de trabajo, el rendimiento entre Postgres y MySQL es comparable con variaciones máximas del 30%. Por otro lado, independientemente de la base de datos que elijas, si tu consulta pierde un índice, podrías sufrir una degradación de 10x ~ 1000x.

Dicho esto, MySQL tiene una ventaja sobre Postgres para cargas de trabajo extremas de escritura intensiva. Puede leer los siguientes artículos para más detalles:

A menos que tu organización alcance una escala similar a la de Uber, el rendimiento de la base de datos no es un factor decisivo. Empresas como Instagram o Notion también utilizan Postgres a gran escala.

Características

Jerarquía de objetos

MySQL emplea un sistema de 4 niveles:

  1. Instancia
  2. Base de datos
  3. Tabla
  4. Columna

Postgres emplea un sistema de 5 niveles:

  1. Instancia (también llamada clúster)
  2. Base de datos
  3. Esquema
  4. Tabla
  5. Columna

Transacción ACID

Ambas bases de datos proporcionan transacciones ACID. En general, Postgres proporciona un soporte de transacciones más sólido:

Base de datos

Escenario

¿Soportado?

Antes de MySQL 8.0

DML (SELECT, INSERT, UPDATE y DELETE)

Desde MySQL 8.0

DML (SELECT, INSERT, UPDATE y DELETE)

Antes de MySQL 8.0

DDL (CREATE, ALTER y DROP)

No

Desde MySQL 8.0

DDL (CREATE, ALTER y DROP)


DDL atómico de instrucción única

postgres

DML (SELECT, INSERT, UPDATE y DELETE)

postgres

DDL (CREATE, ALTER y DROP)

Seguridad

Tanto Postgres como MySQL admiten RBAC, un mecanismo de control de acceso que define los roles y los privilegios para determinar si a un usuario se le debe dar acceso a un recurso.

Postgres admite la Seguridad de nivel de fila (RLS) adicional lista para usar, mientras que MySQL necesita crear vistas adicionales para emular este comportamiento.

Replicación

Para Postgres, la replicación estándar es la replicación física. Para MySQL, la replicación estándar es la replicación lógica usando binlog.

Postgres también admite la replicación lógica a través de su modo de publicación/suscripción.

JSON

Tanto Postgres como MySQL admiten la columna JSON. Postgres admite más funciones:

  • Más operadores para acceder a las características de JSON.
  • Permitir crear índices en campos JSON.

Window Functions

Window Frame Types: MySQL solo admite el tipo de frame ROWS, que te permite definir un frame que consta de un número fijo de filas. Postgres, por otro lado, admite los tipos de frame ROWS y RANGE.

Unidades de rango: MySQL solo admite las unidades de rango UNBOUNDED PRECEDING y CURRENT ROW, mientras que Postgres admite más unidades de rango, incluidas las UNBOUNDED FOLLOWING.

Rendimiento: en general, la implementación de funciones de frame de Postgres se considera más eficiente y eficaz que la implementación de MySQL.

Funciones avanzadas: Postgres admite funciones de ventana más avanzadas, como LAG(), LEAD(), FIRST_VALUE() y LAST_VALUE(). MySQL 8.0 también admite estas funciones de ventana.

Extensibilidad

Postgres admite extensiones. El más destacado es PostGIS, que aporta capacidades geoespaciales a Postgres. Además, está el Foreign Data Wrapper (FDW) para permitir consultas en otros sistemas de datos, pg_stat_statements para realizar un seguimiento de las estadísticas de planificación y ejecución, e incluso pgvector para realizar búsquedas de vectores para aplicaciones de IA.

MySQL tiene una arquitectura de motor de almacenamiento conectable y da nacimiento a InnoDB. Pero hoy, InnoDB se ha convertido en el motor de almacenamiento dominante en MySQL, por lo que la arquitectura conectable solo sirve como un límite de API en lugar de usarse con fines de extensión.

Para la autenticación, tanto Postgres como MySQL admiten el módulo de autenticación conectable (PAM).

Usabilidad

Postgres es más riguroso que MySQL:

  • MySQL permite incluir columnas no agregadas en un SELECT que usa la cláusula GROUP BY. Postgres no lo hace.
  • MySQL no distingue entre mayúsculas y minúsculas de forma predeterminada. Postgres distingue entre mayúsculas y minúsculas de forma predeterminada.

MySQL permite unir tablas de diferentes bases de datos. Postgres solo puede unir tablas dentro de una sola base de datos, a menos que uses la extensión FDW.

Ecosistema

Todas las herramientas comunes de SQL son compatibles tanto con Postgres como con MySQL. Debido a la arquitectura extensible de Postgres y al hecho de que todavía es propiedad de la comunidad, el ecosistema de Postgres es más próspero en los últimos años. Para cada plataforma de aplicaciones que ofrece un servicio de base de datos alojada, todas eligen Postgres.

Conclusión

En general, Postgres tiene más funciones, una comunidad y un ecosistema más prósperos. Mientras que MySQL tiene una curva de aprendizaje más fácil y una base de usuarios más grande.

Observamos la misma tendencia de la industria que el resultado del Stack Overflow, que Postgres es cada vez más utilizado entre los desarrolladores. Pero según nuestra experiencia operativa, la sofisticación de Postgres es algo que debes tener en cuenta. Si no estás familiarizado con Postgres, te sugiero que actives una instancia en el cloud y ejecuta un par de consultas para hacerte una idea. A veces, esas ventajas adicionales no valen la pena y MySQL sería una opción más fácil para ti.