PostgreSQL vs MySQL: cuál elegir

Para un proyecto nuevo, PostgreSQL es la opción más segura: ofrece más recursos de SQL, índices y tipos de datos. MySQL sigue siendo excelente para apps simples y para stacks que ya lo usan.

Actualizado el 5 min de lectura

Objetivos de aprendizaje

Después de leer este artículo podrás:

  • Entender las diferencias reales entre PostgreSQL y MySQL
  • Comparar SQL, JSON, índices y transacciones con ejemplos
  • Elegir la base de datos adecuada para tu tipo de proyecto
En esta página

PostgreSQL y MySQL son las dos bases de datos relacionales de código abierto más usadas. Ambas guardan datos en tablas, hablan SQL, admiten transacciones y corren en cualquier servidor. Para la mayoría de las apps, cualquiera de las dos funciona.

La diferencia aparece en los detalles: tipos de datos, tipos de índice, comportamiento de las transacciones y la sintaxis de algunos comandos. Esta guía compara lo que cambia en la práctica, con código, para que elijas con criterio.

PostgreSQLDDL dentro de la transacciónBEGINALTER 1ALTER 2ROLLBACKtodo se deshaceMySQLBEGINALTER 1commit implícitoALTER 2A medio migrarALTER 1 ya quedó
En PostgreSQL una migración que falla vuelve entera con ROLLBACK; en MySQL cada ALTER ya hace commit y lo que corrió se queda.

¿Qué es cada una?#

PostgreSQL es una base de datos objeto-relacional que prioriza el cumplimiento del estándar SQL y la extensibilidad. Cada versión mayor recibe 5 años de soporte. Mira qué es PostgreSQL para lo básico.

MySQL es una base de datos relacional mantenida por Oracle, conocida por su simplicidad y por estar presente en hostings y CMS como WordPress. Su motor por defecto es InnoDB, que ofrece transacciones ACID, bloqueo por fila, claves foráneas y MVCC. MySQL tiene dos vías de versiones: LTS, que solo recibe correcciones, e Innovation, que puede cambiar comportamientos. Para producción estable, empieza en una serie LTS con soporte. Mira qué es MySQL.

¿En qué se diferencian, lado a lado?#

Criterio PostgreSQL MySQL (InnoDB)
Modelo Objeto-relacional, extensible Relacional
Concurrencia MVCC: leer no bloquea escribir MVCC con bloqueo por fila
DDL en transacción Sí, CREATE y ALTER se pueden revertir No, el DDL hace commit implícito
Índice parcial Sí (CREATE INDEX ... WHERE) No
Índice sobre expresión Sí Sí, con partes de clave funcionales o columnas generadas
JSON jsonb, indexable con GIN Tipo JSON, se indexa un valor extraído
Upsert ON CONFLICT ... DO UPDATE ON DUPLICATE KEY UPDATE
Devolver filas escritas RETURNING No existe
Extensiones Muchas (como PostGIS) Plugins, menos extensible
Curva de aprendizaje Algo mayor Más simple para empezar

¿Cómo cambia el upsert entre las dos?#

Insertar o actualizar si ya existe es una tarea común, y la sintaxis es distinta. En PostgreSQL:

sql
INSERT INTO usuarios (id, nombre)
VALUES (1, 'Ana')
ON CONFLICT (id) DO UPDATE SET nombre = EXCLUDED.nombre
RETURNING id, nombre;

En las versiones actuales de MySQL, usa un alias de fila (la función VALUES() está obsoleta):

sql
INSERT INTO usuarios (id, nombre)
VALUES (1, 'Ana') AS nuevo
ON DUPLICATE KEY UPDATE nombre = nuevo.nombre;

El RETURNING de PostgreSQL devuelve la fila escrita en la misma consulta. En MySQL haces un SELECT después.

¿Cómo manejan transacciones y concurrencia?#

Ambas siguen el modelo ACID y usan MVCC. En PostgreSQL, la documentación dice que leer nunca bloquea escribir y escribir nunca bloquea leer en las consultas normales. Los bloqueos explícitos, como SELECT ... FOR UPDATE, sí esperan.

La diferencia que más sorprende está en las migraciones. En PostgreSQL puedes ejecutar ALTER TABLE dentro de una transacción y hacer ROLLBACK si algo falla. En MySQL, un ALTER TABLE termina la transacción activa con un commit implícito: si la migración falla a la mitad, los pasos anteriores ya quedaron confirmados.

¿Y JSON e índices avanzados?#

Ambas guardan JSON. En PostgreSQL, una columna jsonb se puede indexar con GIN para buscar claves y valores dentro del documento. En MySQL, una columna JSON no se indexa directamente: indexas un valor extraído, mediante una columna generada o una parte de clave funcional.

El índice parcial es otra ventaja de PostgreSQL. Cubre solo las filas que importan:

sql
CREATE INDEX pedidos_abiertos ON pedidos (creado_en) WHERE pagado IS NOT TRUE;

Menos filas indexadas significa un índice más pequeño y escrituras más baratas. En MySQL, el índice siempre cubre todas las filas de la tabla.

¿Una de las dos es más rápida?#

Los benchmarks que coronan a un ganador universal rara vez reflejan tu carga. En ambas, las mayores mejoras vienen del mismo lugar: un índice que coincida con tu WHERE y tu ORDER BY, consultas que traigan solo las columnas necesarias y un pool de conexiones, para no abrir una conexión por petición. Ejecuta EXPLAIN en tus consultas más lentas en cada motor antes de culpar a la base. Si una prueba con tus datos reales muestra una diferencia clara, ese resultado vale más que cualquier benchmark genérico.

¿Cuándo elegir PostgreSQL y cuándo MySQL?#

Elige PostgreSQL si quieres migraciones seguras, JSON consultable, índices parciales, extensiones (como geolocalización) o consultas analíticas más complejas. Es un buen punto de partida para proyectos nuevos y APIs.

Elige MySQL si tu stack ya lo exige (WordPress, sistemas heredados), si tu equipo lo domina o si la app es un CRUD simple. Cambiar de motor sin motivo cuesta más que cualquier ganancia teórica.

En ambos casos, pesan más el índice correcto y un buen modelo de datos que el motor. Si aún dudas entre tipos de base de datos, lee qué base de datos elegir.

Cómo hacerlo en Square Cloud#

Square Cloud ofrece hosting de PostgreSQL y de MySQL desde el plan Standard, siempre en versiones recientes. Creas la base de datos en el panel, y se aprovisiona en segundos en el mismo datacenter que tus aplicaciones (cerca de 1 ms de latencia promedio), con TLS obligatorio. PostgreSQL es el nativo, sin extensiones, así que funciones como PostGIS no están disponibles.

Tú eliges el motor, conectas tu aplicación con la URL de conexión que te entrega el panel y controlas el resto. Ambos motores pueden convivir en el mismo plan, cada uno con al menos 1024 MB de la RAM del plan. Puedes tomar snapshots manuales cuando quieras, y todo plan que incluye bases de datos tiene también un snapshot automático diario. El plan Hobby no incluye hosting de bases de datos.

Conoce el hosting de PostgreSQL y el hosting de MySQL.

Hosting de bases de datos

MongoDB, PostgreSQL, MySQL y Redis junto a tu app

Más información

Preguntas frecuentes

¿PostgreSQL es mejor que MySQL?

No hay un ganador universal. PostgreSQL ofrece más recursos de SQL y de indexación. MySQL es simple, muy extendido y atiende bien a la mayoría de las apps CRUD. La elección depende de lo que necesite el proyecto.

¿Cuál es más rápido, PostgreSQL o MySQL?

Depende de la consulta, de los índices y de la configuración. En apps comunes el motor rara vez decide el resultado, porque un buen índice pesa más. Mide con tus propios datos antes de decidir.

¿Se puede migrar de MySQL a PostgreSQL más adelante?

Sí, pero da trabajo: hay que revisar tipos, sintaxis de upsert, comillas de identificadores y diferencias de comportamiento. Cuanto antes elijas, más barato sale.

¿MySQL y MariaDB son lo mismo?

No. MariaDB nació como un fork de MySQL y hoy evoluciona por separado, con diferencias de funciones. En el día a día se parecen bastante.

Siguiente artículoMongoDB vs PostgreSQLMongoDB vs PostgreSQL comparados: modelo de datos, joins, transacciones, JSON, índices y escalado, y cuándo conviene cada base de datos en tu proyecto.

Más en Bases de datos

Ver los 24 artículos