Framing first: Benchmarks are workload-dependent, and one number without its workload, baseline and dataset is misleading. So this page does not publish a league table of numbers we did not measure. Each entry names the workload, which engine the architecture favours, and where that comes from: Engine docs means the mechanism is documented in the PostgreSQL or MySQL manual, Vendor means the figure is a vendor performance claim and is labelled as one. Replicate against your specific workload before making a decision.

Postgres vs MySQL Performance: 2026 Benchmarks With Sources

Real workload context. Every vendor-sourced figure is labelled. No cherry-picked single-number claims.

Direct answer

Neither PostgreSQL nor MySQL is universally faster. The winner depends on the workload.

Across seven common workloads, MySQL holds a slight edge on simple primary-key reads, sustained insert-heavy writes, and raw connection scaling without pooling. PostgreSQL leads on complex multi-table joins, JSONB / document queries, and analytical (OLAP) workloads. For 99% of applications both are fast enough, so ownership, ecosystem fit, and feature requirements usually matter more than raw benchmark throughput.

WorkloadWinnerMargin
Simple point-lookup (primary key read)MySQLSlight edge; size depends on schema and hardware
Complex multi-table joins / analytical queriesPostgresWorkload-dependent; Postgres planner has more join strategies
JSON / JSONB query performancePostgresStructural advantage for ad-hoc JSON paths; parity for a single known path
Insert-heavy / sustained write workloadsMySQLMySQL InnoDB tuned for sustained writes; Postgres VACUUM overhead can show
Connection scaling (1000+ concurrent connections)MySQLWithout PgBouncer, Postgres degrades sharply. With PgBouncer: near parity.
OLAP / analytical queries (without HeatWave)PostgresSame planner advantage; Citus and pg_duckdb add columnar
Analytics with MySQL HeatWave (on OCI or AWS)MySQL HeatWave400x vs Amazon RDS for MySQL (Oracle's own TPC-H figure)

Margins are workload-dependent and include vendor-sourced figures (flagged below). Replicate against your own workload before deciding.

Workload lens — pick what describes your workload
Showing all 7 scenarios — toggle above to narrow

Simple point-lookup (primary key read)

MySQL winsEngine docs

Slight edge; size depends on schema and hardware

MySQL InnoDB stores the table itself in primary-key order, so a PK lookup reads the row straight out of the index. PostgreSQL stores rows in a heap, so an index scan finds a tuple pointer and then fetches the row from the heap, unless the query is satisfied by an index-only scan. That extra step is the structural reason MySQL tends to edge simple PK reads. PostgreSQL 18 (September 2025) added asynchronous I/O, which narrows read-side gaps.

Source: dev.mysql.com InnoDB Index Types (clustered index) + postgresql.org/docs Index-Only Scans

Complex multi-table joins / analytical queries

Postgres winsEngine docs

Workload-dependent; Postgres planner has more join strategies

PostgreSQL's planner can cost nested-loop, hash and merge joins and reorder joins across a wider search space, and it parallelises sequential scans, joins and aggregates. MySQL historically planned around nested-loop joins and added hash join only in 8.0.18. On multi-table queries with complex predicates, CTEs and aggregation, that wider strategy set is why analytics-adjacent OLTP tends toward Postgres. This is an architectural reading, not a measured result: run your own queries before treating it as a magnitude.

Source: postgresql.org/docs Planner Uses Statistics + Parallel Plans; dev.mysql.com Nested-Loop and Hash Join Optimization

JSON / JSONB query performance

Postgres winsEngine docs

Structural advantage for ad-hoc JSON paths; parity for a single known path

A Postgres GIN index on a JSONB column answers arbitrary containment and path queries without declaring them up front. MySQL indexes JSON through multi-valued indexes (8.0.17+) for arrays and generated-column or functional indexes for specific scalar paths, so each path you want indexed has to be declared in the schema. Where the query paths are known and stable, MySQL is competitive; where they are ad hoc, Postgres does not need a schema change.

Source: postgresql.org/docs JSON Indexing (GIN) + dev.mysql.com Multi-Valued Indexes

Insert-heavy / sustained write workloads

MySQL winsEngine docs

MySQL InnoDB tuned for sustained writes; Postgres VACUUM overhead can show

PostgreSQL's MVCC leaves a dead tuple behind on every UPDATE and DELETE, so sustained write workloads depend on autovacuum keeping up; when it does not, bloat shows up as degraded throughput. InnoDB instead keeps old row versions in a separate undo log. Postgres is competitive on inserts, but heavy UPDATE workloads are where this surfaces and needs tuning. PG 17-18 vacuum memory management and asynchronous I/O narrowed the gap.

Source: postgresql.org/docs Routine Vacuuming + dev.mysql.com InnoDB Multi-Versioning

Connection scaling (1000+ concurrent connections)

MySQL winsEngine docs

Without PgBouncer, Postgres degrades sharply. With PgBouncer: near parity.

PostgreSQL starts a separate backend process per connection, so at 1000+ connections memory and context-switch overhead become dominant. MySQL uses a thread per connection, which costs less each. With PgBouncer in transaction mode multiplexing many client connections onto a small server pool, Postgres reaches practical parity for most workloads.

Source: postgresql.org/docs Connections and Authentication; pgbouncer.org docs (transaction pooling mode)

OLAP / analytical queries (without HeatWave)

Postgres winsEngine docs

Same planner advantage; Citus and pg_duckdb add columnar

On a standard non-sharded deployment the analytical edge comes from the same planner breadth as multi-table joins, not from a separate columnar engine: stock Postgres and stock MySQL are both row stores. Postgres has open extensions that add columnar or vectorised execution (Citus, pg_duckdb). MySQL has no open OLAP acceleration layer; HeatWave is proprietary and cloud-only.

Source: postgresql.org/docs Parallel Query; citusdata.com columnar docs; MySQL has no open equivalent

Analytics with MySQL HeatWave (on OCI or AWS)

MySQL HeatWave winsVendor

400x vs Amazon RDS for MySQL (Oracle's own TPC-H figure)

MySQL HeatWave's in-memory OLAP acceleration is real for the query patterns it supports. Oracle's headline multiples are vendor-published and each one names a different baseline: 400x versus Amazon RDS for MySQL, 1100x versus Amazon Aurora, 18x versus Redshift, all on TPC-H at Oracle's chosen data sizes. A multiple without its baseline and dataset means nothing, so treat these as vendor claims and test your own workload. HeatWave is available only on OCI and AWS, and independent benchmarks are limited.

Source: blogs.oracle.com/mysql HeatWave performance post (vendor-sourced; verify independently)

The honest closer

Performance is rarely the deciding factor in a Postgres vs MySQL choice. Both databases are fast enough for 99% of applications. The ownership question, ecosystem fit, operational familiarity, and specific feature requirements (PostGIS, JSONB GIN, exclusion constraints, or Vitess sharding) matter more than raw benchmark throughput.

Choose based on the workload decision matrix. Verify performance with your specific query patterns and data volumes before making a final call.

GIN index vs MySQL indexingFeature parity 2026Workload decision matrixOperational reality