This page has no score column, and it never will. Every other comparison on toolweight ranks vendors selling roughly the same thing at different prices. These five are engines with different shapes: SQLite is a file format with a query planner attached, PostgreSQL is a process-per-connection MVCC server, MySQL and MariaDB are thread-per-connection MVCC servers tuned for replication, and DuckDB is a columnar analytics engine that happens to speak SQL. Weighting them against each other would produce a number that says more about the weights than the engines. So instead the table is descriptive, and the decision lives in prose.
PostgreSQL is the correct default for most teams, and the reason is boring: it has the widest SQL surface, the best extension ecosystem, and the most people who already know it. pgvector made it the default vector store too, which killed a whole category of standalone databases. What the marketing never mentions is the operational tax. Postgres is the heaviest engine here to run — that is the killer field on this page. Autovacuum tuning, transaction-ID wraparound, bloat, a process per connection so PgBouncer stops being optional past a few hundred clients, and major-version upgrades that mean pg_upgrade or a logical-replication cutover. Managed Postgres exists precisely because self-hosting it well is a job.
SQLite is the most under-used engine here and the most over-claimed by the people who love it. The claims are true: WAL mode gives many concurrent readers, and one machine with an NVMe disk serves an astonishing amount of traffic with zero network hops. The constraints get skipped: one writer at a time, no built-in replication, a twelve-step table rebuild for most schema changes beyond ADD COLUMN, and a backup story that means adopting Litestream or Turso. That is a straight trade, not a warning. One process, short writes, and you are buying a great deal of simplicity.
MySQL and MariaDB are still the right answer more often than the Postgres-shaped internet admits, for one specific reason: changing the schema of a very large table without taking writes offline. Online DDL, INSTANT ADD COLUMN, and a decade of gh-ost and pt-online-schema-change in production make that routine in a way it is not on Postgres. Thread-per-connection also forgives a badly behaved pool. Against that: a narrower SQL surface, a thin extension ecosystem, and a licence question. MySQL is GPLv2-or-commercial under Oracle, MariaDB is GPLv2 under a foundation. Shipping the server inside a product makes that difference the whole decision; running a website makes it noise.
The tree, then. Does more than one process write to this data concurrently? If no, and the working set fits on one disk, use SQLite and turn on WAL mode. If yes: does a meaningful share of your query load look like aggregation over columns rather than fetching rows by key? If so, that half of the workload belongs in DuckDB or a warehouse, not in your OLTP engine, and the remaining half is a smaller problem. Then: do you need extensions — pgvector, PostGIS, TimescaleDB — or window-heavy, CTE-heavy SQL? If yes, PostgreSQL, and budget for the operations. If no, and your actual fear is altering a 500 GB table without downtime, MySQL or MariaDB. If none of that discriminates, it is a genuine tie, and a tie means pick the engine somebody on the team has already debugged at three in the morning.