Quick Answer

PostgreSQL is the more feature-rich, standards-compliant option: richer data types, a powerful extension system, strict data validation, and strong support for complex queries and JSON. MySQL is simpler, extremely widely deployed, historically favored for read-heavy web workloads, and has a huge hosting and tooling ecosystem. For a new project without a specific reason to prefer MySQL, PostgreSQL is the common default in 2026 - but both are excellent and the choice rarely limits a normal application.

The honest summary

For the vast majority of applications, either database will serve you well for years. Both are open source, both are fast, both have mature replication, both are supported by every ORM and every cloud provider. Teams succeed and fail with each. If you already know one well, that familiarity is worth more than any feature-list advantage.

That said, the two have different philosophies. PostgreSQL positions itself as a correct, extensible, standards-following database that does not cut corners. MySQL grew up serving high-traffic websites and historically optimized for simplicity and read performance, sometimes accepting looser behavior to get there. Modern MySQL has closed much of the strictness gap, but the design cultures still show.

The rest of this post is the differences that actually influence a decision.

Data types and JSON

PostgreSQL has a notably wider type system: native arrays, a real boolean, network address types (inet, cidr), ranges, UUID, geometric types, and full-text search types, plus the ability to define your own. It also has a proper ENUM and case-sensitive vs case-insensitive text handling via citext.

Both support JSON, but differently. PostgreSQL's jsonb stores JSON in a decomposed binary form, supports indexing individual keys with GIN indexes, and has a rich set of operators and functions for querying and updating nested data. MySQL's JSON type is also binary and queryable, and MySQL supports functional indexes on JSON paths, but PostgreSQL's jsonb tooling is generally considered more powerful for document-style workloads.

Practical impact: if part of your schema is genuinely semi-structured - user-defined fields, event payloads, config blobs you query into - PostgreSQL's jsonb often lets you avoid adding a separate document database.

Strictness and correctness

Historically MySQL would silently accept bad data: inserting a string into a number column, a date of 0000-00-00, or a value too long for a column, and quietly coerce or truncate it. Since MySQL 5.7, STRICT_TRANS_TABLES is on by default and most of these now raise errors - but you should still confirm your sql_mode, because a migrated or misconfigured instance can revert to lenient behavior.

PostgreSQL has always rejected data that does not fit the column. It also enforces CHECK constraints reliably, supports NOT VALID constraints you can add without a full scan, and its transactional DDL means a failed migration rolls back schema changes cleanly - ALTER TABLE inside a transaction that aborts leaves nothing behind. MySQL's DDL is not transactional; a migration that fails partway can leave the schema in an intermediate state.

That transactional-DDL difference is one of the strongest day-to-day arguments for PostgreSQL on a team that ships schema changes often.

Concurrency and query features

Both use multiversion concurrency control (MVCC) so readers do not block writers. The implementations differ - PostgreSQL keeps old row versions in the table and cleans them with VACUUM (autovacuum handles this, but a neglected instance can bloat), while MySQL's InnoDB stores old versions in a separate undo log.

PostgreSQL has broader support for advanced query features: RETURNING on INSERT/UPDATE/DELETE, richer window functions, LATERAL joins, full FULL OUTER JOIN, common table expressions with recursion (MySQL added CTEs and window functions in 8.0, closing much of this), materialized views, and partial and expression indexes. It also has more index types out of the box: B-tree, hash, GIN, GiST, BRIN.

MySQL's strengths include a very mature replication story, the pluggable storage engine architecture, and historically excellent performance on simple primary-key reads, which is exactly the access pattern of many web apps.

Extensions and ecosystem

PostgreSQL's extension system is a genuine differentiator. PostGIS makes it a leading geospatial database. pg_stat_statements gives query-level performance stats. pgvector adds vector similarity search for embeddings. TimescaleDB turns it into a time-series database. These install with CREATE EXTENSION and behave like built-in features.

MySQL's ecosystem strength is deployment ubiquity. Shared hosting, WordPress, and a large share of the legacy web run on MySQL or its drop-in fork MariaDB. Managed MySQL is available everywhere, often at the lowest price tier, and there is a deep well of operational knowledge.

The fork note: MySQL is owned by Oracle. MariaDB is a community fork that stays largely compatible and is what many Linux distributions ship by default. If Oracle ownership is a concern for your organization, MariaDB is the usual answer, and most of this comparison applies to it too.

Which to choose

Choose PostgreSQL when: you want transactional schema migrations; your data has a semi-structured component that jsonb can absorb; you need geospatial, vector, or time-series features via extensions; you rely on advanced SQL (CTEs, window functions, RETURNING, partial indexes); or you simply want the stricter, more standards-compliant default.

Choose MySQL (or MariaDB) when: your workload is dominated by simple primary-key reads at high volume; you are deploying into an ecosystem built around it (WordPress, certain shared hosts); your team already runs MySQL well; or you want the widest, cheapest managed-hosting options.

What should not drive the decision: raw benchmark numbers from a blog post, or a feature you will never use. Both databases will handle millions of rows and thousands of queries per second on modest hardware. Pick for the features you will actually lean on and the operational knowledge your team has.

Frequently Asked Questions

Is PostgreSQL faster than MySQL? Neither is universally faster. MySQL's InnoDB has historically been very fast on simple primary-key lookups; PostgreSQL tends to do better on complex analytical queries and concurrent write-heavy workloads. For most applications the difference is not the bottleneck.
Which has better JSON support? Both store JSON in a binary, queryable form. PostgreSQL's jsonb has a richer set of operators, functions, and indexing options (GIN indexes on keys), which makes it stronger for document-style data.
Does MySQL still silently accept bad data? Much less so. Since MySQL 5.7, strict SQL mode is on by default and most invalid inserts now error. You should still verify sql_mode on any inherited instance, since it can be configured back to lenient behavior.
What is the difference between MySQL and MariaDB? MariaDB is a community-driven fork of MySQL created after Oracle acquired MySQL. It stays broadly compatible, ships by default on many Linux distributions, and most PostgreSQL-vs-MySQL comparisons apply to it equally.
Can I switch databases later? It is possible but rarely trivial - data types, JSON functions, sequence vs auto-increment behavior, and vendor-specific SQL all differ. An ORM reduces the pain but does not eliminate it. Choose deliberately up front.