I run MySQL and PostgreSQL in production for different clients, and the truth is that for a typical web application both are excellent. The decision comes down to workload shape and team experience, not benchmarks from someone else's blog. Here is how I actually decide.
Where MySQL wins
- Simple read-heavy workloads — its query path for primary-key lookups is extremely fast
- Replication maturity: read replicas are a checkbox on RDS and battle-tested everywhere
- Hosting ubiquity: every panel, every host, every ops team knows it
- Ecosystem fit: WordPress, most PHP applications, and a lot of legacy tooling assume it
Where PostgreSQL wins
- Complex queries: CTEs, window functions, and the planner handle analytical SQL gracefully
- JSONB with real indexing (GIN) — a document store inside your relational database
- Strictness: it refuses silently bad data that MySQL historically accepted
- Extensions: PostGIS for geo, pg_trgm for fuzzy search, and full-text search good enough to delay Elasticsearch
My rule of thumb
CRUD-shaped product with heavy reads and a team that knows LAMP? MySQL, no hesitation. Anything with reporting, JSON-heavy payloads, geo queries, or gnarly business constraints? PostgreSQL. Migrating between them later is possible but painful, so spend an hour on this decision — not zero, and not a week.
What matters more than the engine
Indexes that match your queries, connection pooling, sensible timeouts, automated backups you have actually restored once, and monitoring slow queries. A well-tuned MySQL beats a neglected PostgreSQL every single time — and vice versa.

