This page deliberately does not rank these. They are three good engines with different deployment models, and a scoreboard would be dishonest.
Postgres is the default answer, and it should be. It has the strictest standards compliance of the three, the best type system (real arrays, JSONB, ranges, native UUIDs, custom types), and an extension ecosystem that no other database matches — PostGIS for geospatial, pgvector for embeddings, TimescaleDB for time series, pg_cron for scheduling. Its MVCC implementation gives you proper snapshot isolation. If you have no reason to choose otherwise, choose Postgres and stop reading.
SQLite is the most underrated option in web development. It is not a toy: it is the most widely deployed database engine in the world, it is exhaustively tested, and on modern hardware with WAL mode it handles far more concurrent read traffic than people expect. Because it runs in-process, queries cost microseconds rather than a network round trip, which means an application that would need careful query batching against Postgres can be naive against SQLite and still be faster. The constraint is a single writer at a time and the fact that your database lives on one machine's disk — a genuine constraint, and one that a large fraction of applications never actually hit.
MySQL is the pragmatic incumbent. It is fast, extremely well understood, replication is mature and battle-tested at enormous scale, and the managed hosting market is deep and cheap. Its type handling has historically been laxer than Postgres, and its extension story is thinner. If you already run it well, there is no urgent reason to move.
The wrong question is which is best. The right question is where your data should live: in the process, on a server you manage, or in a managed service.