Hola a todos, para una nueva entrada de nuestro blog hemos querido tratar un tema que suele ser muy recurrente en todos los foros, ¿cómo es el rendimiento de Postgres comparado con MySQL?. Vamos a realizar pruebas de rendimiento para comprobarlo.
Para estas pruebas hemos preparado una máquina Linux con los dos motores instalados para que compitan en igualdad de condiciones. Para ejercer de árbitro imparcial hemos utilizado Sysbench, que es una herramienta de benchmarking de código abierto que permite realizar pruebas de rendimiento en sistemas de bases de datos. Su diseño modular permite simular diversas cargas de trabajo, como transacciones de lectura, escritura y lectura/escritura, facilitando la evaluación del rendimiento y la escalabilidad de diferentes motores de bases de datos.
En nuestras pruebas, utilizamos Sysbench para evaluar el rendimiento de MySQL 8 y PostgreSQL 15. Configuramos varios tipos de carga de trabajo, incluyendo pruebas de lectura y escritura, escritura únicamente y solo lectura, para obtener una comprensión completa de cómo cada base de datos maneja diferentes patrones de acceso a datos.
Entorno Preparado
| Máquina física | MySQL 8 | PostgreSQL 15 |
| Sistema operativo: CentOS Linux release 8.3.2011 Memoria: 16Gb Procesador: AMD FX(tm)-6200 Six-Core Processor | Versión: 8.0.21 Comandos: mysql -u root CREATE DATABASE sbtest; | Versión: 15.2 Comandos: su – postgres psql CREATE DATABASE sbtest; |
Configuración de Sysbench para las pruebas
En ambos entornos vamos a crear las tablas e índices que utiliza Sysbench para las pruebas, para ello se utiliza el comando sysbench con la opción prepare:
MySQL
sysbench oltp_read_write --db-driver=mysql --mysql-user=root --mysql-db=sbtest --tables=10 --table-size=100000 prepare
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Creating table 'sbtest1'...
Inserting 100000 records into 'sbtest1'
PostgreSQL
sysbench oltp_read_write --db-driver=pgsql --pgsql-user=postgres --pgsql-db=sbtest --tables=10 --table-size=100000 prepare
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Creating table 'sbtest1'...
Inserting 100000 records into 'sbtest1'
Primera prueba de Lectura y Escritura.
En ambos entornos vamos a lanzar la carga con 8 hilos en paralelo durante 60 segundos:
MySQL
sysbench oltp_read_write --db-driver=mysql --mysql-user=root --mysql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 run
- PostgreSQL
sysbench oltp_read_write --db-driver=pgsql --pgsql-user=postgres --pgsql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 run
Resultados de la primera prueba (Lectura y escritura):
| MySQL | PostgreSQL |
| Total de consultas: 557,700 Consultas de lectura: 390,390 Consultas de escritura: 111,540 Transacciones: 27,885 (464.56 por seg.) Consultas por segundo: 9,291.17 Latencia: Promedio 17.21 ms Tiempo total: 60.0218 s | Total de consultas: 1,137,744 Consultas de lectura: 995,526 Consultas de escritura: 218,130 Transacciones: 71,109 (1,184.86 por seg.) Consultas por segundo: 18,957.75 Latencia: Promedio 6.75 ms Tiempo total: 60.0116 s |
Comparativa (Lectura y Escritura)
| Métrica | MySQL | PostgreSQL |
| Total de consultas | 557,700 | 1137,744 |
| Transacciones/s | 464,56 | 1184,86 |
| Consultas/s | 9291,17 | 18957,75 |
| Latencia promedio (ms) | 17,21 | 6,75 |
MySQL
sysbench oltp_write_only --db-driver=mysql --mysql-user=root --mysql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 run
PostgreSQL
sysbench oltp_write_only --db-driver=pgsql --pgsql-user=postgres --pgsql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 run

Segunda prueba de Solo Escritura
Resultados de Solo Escritura
| Métrica | MySQL | PostgreSQL |
| Total de consultas | 224,910 | 1,081,106 |
| Consultas de escritura | 149,940 | 720,579 |
| Transacciones/s | 37,485 (621.85 por seg.) | 180,147 (3,001.74 por seg.) |
| Consultas/s | 3,731.10 | 18,014.17 |
| Latencia promedio (ms) | 12.86 ms | 2.66 ms |
| Tiempo total | 60.2767 s | 60.0117 s |
Comparativa (Solo Escritura)
| Métrica | MySQL | PostgreSQL |
| Total de consultas | 224,910 | 1,081,106 |
| Transacciones/s | 621.85 | 3,001.74 |
| Consultas/s | 3,731.10 | 18,014.17 |
| Latencia promedio (ms) | 12.86 | 2.66 |
Tercera prueba de Solo Lectura
MySQL
sysbench oltp_read_only --db-driver=mysql --mysql-user=root --mysql-db=sbtest --tables=10 --table-size=100000 --threads=8 --time=60 run
Resultados de Solo Lectura
| Métrica | MySQL | PostgreSQL |
| Total de consultas | 2.413.600 | 1.137.744 |
| Consultas de lectura | 2.111.900 | 995.526 |
| Transacciones/s | 150,850 (2.513,86 por seg.) | 71,109 (1.184,86 por seg.) |
| Consultas/s | 40.221,73 | 18.957,75 |
| Latencia promedio (ms) | 3,18 ms | 6,75 ms |
| Tiempo total | 60,2767 s | 60,0117 s |
Comparativa (Solo Lectura)
| Métrica | MySQL | PostgreSQL |
| Total de consultas | 2,413,600 | 1,137,744 |
| Transacciones/s | 2,513,86 | 1.184,86 |
| Consultas/s | 40,221,73 | 18,957.75 |
| Latencia promedio (ms) | 3,18 | 6,75 |
Conclusiones de las pruebas
Al final nos ha salido lo mismo que se suelen ver en todas las pruebas de benchmarking que puedes encontrar por Internet:
- Rendimiento General: PostgreSQL mostró un rendimiento superior en las pruebas de escritura y lectura/escritura, mientras que MySQL tuvo un rendimiento muy superior en pruebas de solo lectura.
- Carga de Escritura: PostgreSQL es especialmente eficiente para cargas de escritura, demostrando un rendimiento notablemente más alto en comparación con MySQL.
- Carga de Lectura: MySQL mostró un rendimiento sobresaliente en la prueba de solo lectura, superando a PostgreSQL en la cantidad de consultas por segundo y transacciones.
Los resultados obtenidos reflejan una tendencia comúnmente observada en la comunidad de bases de datos: la elección del motor adecuado depende en gran medida del tipo de carga de trabajo y los requisitos específicos de la aplicación.
Rendimiento de MySQL en entornos de solo lectura:
MySQL 8 ha demostrado ser especialmente eficiente en escenarios de solo lectura, donde las consultas se centran principalmente en la extracción de datos sin grandes volúmenes de transacciones de escritura. Esto hace que sea una opción adecuada para:
- Aplicaciones web: donde la mayoría de las consultas son SELECT, como en portales web, CMS (sistemas de gestión de contenido) y e-commerce, donde la rapidez en la entrega de datos es crucial.
- Sistemas de análisis de datos ligeros: aquellos que no requieren operaciones de procesamiento de datos complejas y se benefician de un motor optimizado para la lectura rápida de datos.
Rendimiento de PostgreSQL en entornos de escritura intensiva:
Por otro lado, PostgreSQL 15 ha mostrado un desempeño superior en cargas de trabajo de escritura y en situaciones de lectura/escritura intensivas. Esto es especialmente importante para:
- Sistemas OLTP (Online Transaction Processing): donde hay un alto volumen de transacciones de escritura y actualización de datos. PostgreSQL, con su robusta gestión de transacciones ACID, es ideal para asegurar la integridad de los datos.
- Aplicaciones financieras y de contabilidad: que requieren consistencia en las transacciones y deben manejar escrituras concurrentes sin comprometer la estabilidad del sistema.
- Entornos con procesamiento de datos más complejo: tales como sistemas que manejan funciones de agregación, análisis geoespacial, y manejo de datos JSON. PostgreSQL ofrece un conjunto de funcionalidades avanzadas como índices GIN/GiST y operaciones sobre JSONB, que le permiten trabajar eficientemente con datos complejos.
Escalabilidad y optimización de cada motor:
- MySQL: Es ideal para entornos donde la escalabilidad horizontal es clave, ya que su ecosistema incluye opciones como MySQL Cluster y diferentes mecanismos de replicación. Su rendimiento en consultas de solo lectura puede ser maximizado mediante el uso de cachés de consulta y configuraciones de lectura-escritura separadas.
- PostgreSQL: Se destaca cuando la carga de trabajo demanda integridad y seguridad transaccional, pero también cuando se necesita trabajar con cargas mixtas de lectura y escritura. Su arquitectura robusta y su capacidad de manejo de concurrencia (MVCC) le otorgan una gran capacidad para escalar en vertical y manejar cargas de trabajo complejas.
Recomendaciones finales tras las pruebas:
La decisión entre MySQL y PostgreSQL debe estar alineada con las características de la aplicación y el entorno de despliegue. Si tu aplicación necesita procesar un alto volumen de consultas de lectura de manera rápida y eficiente, como ocurre en la mayoría de las aplicaciones web, MySQL sigue siendo una elección sólida. Sin embargo, si tu sistema se caracteriza por un alto número de transacciones de escritura y requiere una robusta gestión de integridad de datos, PostgreSQL es la mejor opción para asegurar un rendimiento consistente y una escalabilidad a largo plazo.
Ambos motores tienen fortalezas y debilidades, pero aprovechar sus ventajas dependerá de conocer en detalle las características de la carga de trabajo que se va a manejar y optimizar la configuración para sacar el mejor rendimiento de cada uno.
Muchas gracias por vuestro tiempo y esperamos que estas pruebas os sean útiles para tomar la mejor decisión en la elección del motor de base de datos para vuestros proyectos. Si no sabes cuál elegir, contacta con nosotros para valorar tu caso.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
