Pruebas de Rendimiento de MySQL 8 y PostgreSQL 15 con Sysbench

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ísicaMySQL 8PostgreSQL 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):

MySQLPostgreSQL
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étricaMySQLPostgreSQL
Total de consultas557,7001137,744
Transacciones/s464,561184,86
Consultas/s9291,1718957,75
Latencia promedio (ms)17,216,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
Pruebas de Rendimiento de MySQL 8 y PostgreSQL 15

Segunda prueba de Solo Escritura

Resultados de Solo Escritura

MétricaMySQLPostgreSQL
Total de consultas224,9101,081,106
Consultas de escritura149,940720,579
Transacciones/s37,485 (621.85 por seg.)180,147 (3,001.74 por seg.)
Consultas/s3,731.1018,014.17
Latencia promedio (ms)12.86 ms2.66 ms
Tiempo total60.2767 s60.0117 s

Comparativa (Solo Escritura)

MétricaMySQLPostgreSQL
Total de consultas224,9101,081,106
Transacciones/s621.853,001.74
Consultas/s3,731.1018,014.17
Latencia promedio (ms)12.862.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étricaMySQLPostgreSQL
Total de consultas2.413.6001.137.744
Consultas de lectura2.111.900995.526
Transacciones/s150,850 (2.513,86 por seg.)71,109 (1.184,86 por seg.)
Consultas/s40.221,7318.957,75
Latencia promedio (ms)3,18 ms6,75 ms
Tiempo total60,2767 s60,0117 s

Comparativa (Solo Lectura)

MétricaMySQLPostgreSQL
Total de consultas2,413,6001,137,744
Transacciones/s2,513,861.184,86
Consultas/s40,221,7318,957.75
Latencia promedio (ms)3,186,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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *