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?
- ¿Qué es PostgreSQL?
- Diferencias principales
- Tipos de datos avanzados
- Rendimiento y concurrencia
- MySQL vs PostgreSQL con Spring Boot
- Herramientas y administración
- Tabla comparativa completa
- ¿Cuándo usar cada una?
- Conclusión y mi recomendación
¿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:
- B-tree: el estándar para igualdad y rangos (ambas bases de datos)
- Hash: optimizado para igualdad exacta
- GIN: ideal para arrays, JSON y búsqueda de texto completo
- GiST: para tipos geométricos y datos complejos
- BRIN: muy eficiente para tablas grandes con datos ordenados naturalmente
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ística | MySQL | PostgreSQL |
|---|---|---|
| Licencia | GPL / Comercial (Oracle) | PostgreSQL License (libre) |
| Rendimiento lectura simple | Excelente | Muy bueno |
| Consultas complejas | Bueno | Excelente |
| Concurrencia escritura | Bueno | Excelente |
| Soporte JSON | Bueno | Excelente (JSONB) |
| Arrays nativos | No | Sí |
| Tipos geoespaciales | Limitado | Excelente (PostGIS) |
| Cumplimiento SQL | Parcial | Estricto |
| Extensibilidad | Limitada | Muy alta |
| Facilidad de uso | Alta | Media-alta |
| Disponibilidad hosting | Universal | Selectiva |
| Popularidad 2024 | Muy alta | Muy alta (creciendo) |
| Con Spring Boot | Perfecto | Perfecto |
| Herramienta gráfica | MySQL Workbench | pgAdmin / DBeaver |
¿Cuándo usar cada una?
Usa MySQL si:
- Construyes aplicaciones web tradicionales con muchas lecturas — blogs, tiendas, CMS
- Trabajas con WordPress, Drupal o cualquier CMS popular
- Tu hosting solo ofrece MySQL
- Priorizas la simplicidad de administración y configuración
- Estás empezando con bases de datos y quieres la curva más suave
- El equipo ya conoce MySQL
Usa PostgreSQL si:
- Tu aplicación tiene consultas complejas o analíticas
- Necesitas almacenar y consultar datos JSON de forma eficiente
- Tu aplicación tiene alta concurrencia de escrituras simultáneas
- Necesitas arrays, tipos geométricos u otros tipos de datos avanzados
- Despliegas en Railway, Render, Supabase o plataformas modernas que usan PostgreSQL por defecto
- Quieres aprender la base de datos más completa y con más futuro
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.