MySQL vs PostgreSQL es una de las decisiones más comunes cuando empiezas un proyecto con base de datos relacional. Ambas son gratuitas, maduras y usadas en producción por millones de empresas. Pero tienen diferencias importantes que pueden influir en tu decisión dependiendo del tipo de proyecto que vayas a construir.

Yo uso MySQL a diario en proyectos con Spring Boot y he trabajado con PostgreSQL en proyectos que requerían consultas más complejas. Te cuento las diferencias reales con ejemplos concretos.

En este artículo:

¿Qué es MySQL?

MySQL es el sistema de gestión de bases de datos relacional más usado del mundo. Fue creado en 1995 y actualmente es propiedad de Oracle, aunque sigue siendo open source bajo licencia GPL. Es la base de datos por defecto en la mayoría de hostings web y el estándar en el stack LAMP (Linux, Apache, MySQL, PHP).

Su popularidad se debe principalmente a tres factores: es extremadamente fácil de instalar y configurar, tiene un rendimiento excelente en operaciones de lectura simples y está disponible en prácticamente todos los proveedores de hosting del mundo. WordPress, Drupal, Joomla y la mayoría de CMS usan MySQL por defecto.

Existe también MariaDB, un fork de MySQL creado por el fundador original tras la compra por Oracle. MariaDB es compatible al 100% con MySQL pero con algunas mejoras de rendimiento y nuevas funcionalidades. Muchos hostings sirven MariaDB cuando dices «MySQL».

¿Qué es PostgreSQL?

PostgreSQL, también conocido como Postgres, es un sistema de base de datos objeto-relacional de código abierto. Lleva en desarrollo desde 1986 y destaca por su cumplimiento estricto del estándar SQL y sus funcionalidades avanzadas.

En los últimos años ha ganado muchísima popularidad. Según la encuesta de Stack Overflow 2024, PostgreSQL ha superado a MySQL como la base de datos más usada entre desarrolladores profesionales por primera vez en la historia. Plataformas como Railway, Render y Supabase usan PostgreSQL por defecto, lo que refleja la tendencia del sector.

Su licencia PostgreSQL es más permisiva que la GPL de MySQL — puedes usarlo en proyectos comerciales sin restricciones.

Diferencias principales

Filosofía de diseño

MySQL prioriza la velocidad y la simplicidad. Su objetivo es ser rápido en operaciones comunes y fácil de usar. Esto lo hace ideal para aplicaciones web con muchas lecturas y esquemas de datos relativamente simples.

PostgreSQL prioriza la corrección y la funcionalidad completa. Su objetivo es cumplir el estándar SQL de forma estricta y ofrecer todas las funcionalidades posibles. Esto lo hace más potente pero también más complejo en algunos aspectos de administración.

Cumplimiento del estándar SQL

PostgreSQL cumple el estándar SQL de forma más estricta que MySQL. Por ejemplo, MySQL históricamente permitía hacer cosas como esta sin dar error:

-- MySQL (versiones antiguas) permite esto sin error:
SELECT nombre, COUNT(*)
FROM usuarios
GROUP BY ciudad;  -- nombre no está en GROUP BY ni es agregado

-- PostgreSQL lanza error correctamente:
-- ERROR: column "nombre" must appear in the GROUP BY clause

Este tipo de comportamiento permisivo de MySQL puede ocultar errores lógicos en tus consultas. PostgreSQL es más estricto y te obliga a escribir SQL correcto desde el principio.

Extensibilidad

PostgreSQL es enormemente extensible. Puedes crear tus propios tipos de datos, operadores, funciones y métodos de indexación. La extensión más famosa es PostGIS, que añade soporte geoespacial completo y convierte PostgreSQL en una base de datos GIS de nivel profesional.

MySQL es menos extensible — no permite crear tipos de datos personalizados ni métodos de indexación propios.

Tipos de datos avanzados

Esta es una de las diferencias más prácticas entre ambas bases de datos.

JSON y JSONB

PostgreSQL tiene soporte nativo para JSON y JSONB (JSON binario optimizado). JSONB permite indexar y consultar datos JSON de forma muy eficiente:

-- PostgreSQL: crear tabla con columna JSONB
CREATE TABLE productos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    atributos JSONB
);

-- Insertar datos JSON
INSERT INTO productos (nombre, atributos)
VALUES ('Portátil', '{"ram": "16GB", "procesador": "i7", "ssd": true}');

-- Consultar dentro del JSON con índice
SELECT nombre FROM productos
WHERE atributos->>'ram' = '16GB';

-- Crear índice GIN para búsquedas eficientes en JSON
CREATE INDEX idx_atributos ON productos USING GIN(atributos);

MySQL tiene soporte JSON desde la versión 5.7, pero sin el tipo JSONB optimizado y con menos opciones de indexación.

Arrays

PostgreSQL permite almacenar arrays directamente en columnas, algo que MySQL no soporta:

-- PostgreSQL: columna de tipo array
CREATE TABLE articulos (
    id SERIAL PRIMARY KEY,
    titulo VARCHAR(200),
    tags TEXT[]
);

INSERT INTO articulos (titulo, tags)
VALUES ('Guía de Angular', ARRAY['angular', 'typescript', 'frontend']);

-- Buscar artículos que contengan un tag específico
SELECT titulo FROM articulos
WHERE 'angular' = ANY(tags);

Tipos geométricos y geoespaciales

PostgreSQL tiene tipos nativos para geometría: POINT, LINE, CIRCLE, POLYGON. Con la extensión PostGIS se convierte en una base de datos geoespacial completa, ideal para aplicaciones de mapas, logística o cualquier proyecto que trabaje con coordenadas.

Tipos enumerados

-- PostgreSQL: tipo ENUM personalizado
CREATE TYPE estado_pedido AS ENUM ('pendiente', 'procesando', 'enviado', 'entregado');

CREATE TABLE pedidos (
    id SERIAL PRIMARY KEY,
    estado estado_pedido DEFAULT 'pendiente'
);

Rendimiento y concurrencia

MySQL es generalmente más rápido en operaciones de lectura simples y es la opción preferida para aplicaciones web con muchas lecturas y pocas escrituras complejas. Si tienes un blog, una tienda online o una aplicación CRUD estándar, MySQL es muy difícil de superar en velocidad.

PostgreSQL rinde mejor en consultas complejas, grandes volúmenes de datos y operaciones de escritura concurrentes. Su sistema MVCC (Multi-Version Concurrency Control) es más robusto — las lecturas nunca bloquean las escrituras y viceversa, lo que es crucial en aplicaciones con alta concurrencia.

En aplicaciones modernas con muchos usuarios simultáneos escribiendo datos — sistemas de reservas, plataformas de trading, aplicaciones colaborativas — PostgreSQL maneja la concurrencia de forma más eficiente.

Índices

PostgreSQL ofrece más tipos de índices que MySQL:

MySQL principalmente usa índices B-tree, con soporte limitado para índices de texto completo (FULLTEXT).

MySQL vs PostgreSQL con Spring Boot

Spring Boot funciona perfectamente con ambas bases de datos a través de Spring Data JPA. La buena noticia es que el código Java es prácticamente idéntico — solo cambia la configuración en application.properties y las dependencias en pom.xml.

Configuración para MySQL:

# pom.xml
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mibase?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=tupassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

Configuración para PostgreSQL:

# pom.xml
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

# application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/mibase
spring.datasource.username=postgres
spring.datasource.password=tupassword
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

El resto del código — entidades JPA, repositorios, servicios — es exactamente igual en ambos casos. Cambiar de MySQL a PostgreSQL en un proyecto Spring Boot es cuestión de cambiar estas líneas de configuración y las dependencias.

Una diferencia práctica importante: MySQL usa AUTO_INCREMENT para las claves primarias y PostgreSQL usa SERIAL o SEQUENCE. Con JPA esto se gestiona automáticamente mediante @GeneratedValue(strategy = GenerationType.IDENTITY), que funciona igual en ambas.

Herramientas y administración

MySQL Workbench es la herramienta gráfica oficial de MySQL. Permite diseñar esquemas visualmente, ejecutar consultas, gestionar usuarios y monitorizar el servidor. Es gratuita y muy completa.

pgAdmin es la herramienta gráfica más popular para PostgreSQL. Es más compleja que MySQL Workbench pero también más potente. Existe también DBeaver, una herramienta universal que funciona perfectamente con ambas bases de datos y que muchos desarrolladores prefieren por su interfaz más moderna.

Para desarrollo local, TablePlus es una opción premium muy valorada que soporta ambas bases de datos con una interfaz mucho más limpia que las herramientas oficiales.

Tabla comparativa completa

CaracterísticaMySQLPostgreSQL
LicenciaGPL / Comercial (Oracle)PostgreSQL License (libre)
Rendimiento lectura simpleExcelenteMuy bueno
Consultas complejasBuenoExcelente
Concurrencia escrituraBuenoExcelente
Soporte JSONBuenoExcelente (JSONB)
Arrays nativosNo
Tipos geoespacialesLimitadoExcelente (PostGIS)
Cumplimiento SQLParcialEstricto
ExtensibilidadLimitadaMuy alta
Facilidad de usoAltaMedia-alta
Disponibilidad hostingUniversalSelectiva
Popularidad 2024Muy altaMuy alta (creciendo)
Con Spring BootPerfectoPerfecto
Herramienta gráficaMySQL WorkbenchpgAdmin / DBeaver

¿Cuándo usar cada una?

Usa MySQL si:

Usa PostgreSQL si:

Conclusión y mi recomendación

Para la mayoría de proyectos web y aplicaciones con Spring Boot, MySQL es la opción práctica: más fácil de encontrar en hostings, más simple de administrar y más que suficiente para el 90% de los casos de uso.

Sin embargo, si estás empezando desde cero y tienes la opción de elegir libremente, yo elegiría PostgreSQL. La tendencia del sector va claramente en esa dirección — ya superó a MySQL en popularidad entre desarrolladores profesionales — y sus funcionalidades avanzadas te dan más herramientas para resolver problemas complejos. Plataformas modernas como Supabase han apostado todo por PostgreSQL, y no es casualidad.

La buena noticia es que con Spring Boot puedes empezar con MySQL y migrar a PostgreSQL más adelante con muy poco esfuerzo — solo cambias la configuración. Lo importante es dominar SQL y JPA, que funcionan igual en ambas.