PostgreSQL vs MySQL nel 2026: la scelta dipende dai dati che devi gestire, non dall’abitudine. PostgreSQL domina su dati complessi, JSONB e analisi, mentre MySQL vince su carichi OLTP ad alta concorrenza e letture semplici.
| Caratteristica | PostgreSQL | MySQL |
|—|—|—|
| Modello connessioni | Process-per-connection | Thread-per-connection |
| Dati JSONB | Nativo, indicizzabile con GIN | Supportato, indicizzazione limitata |
| Tipi di dati | 40+ nativi (Array, UUID, Enum) | Base, workaround per tipi avanzati |
| Licenza | PostgreSQL License (libera) | GPL + Commercial (Oracle) |
| Miglior per | Data warehousing, GIS, JSON | Web app, CMS, e-commerce semplice |
Quando ho gestito la migrazione da MySQL a PostgreSQL in un ambiente con 2.000 endpoint, la decisione originaria risaliva a 3 anni prima. Avevano scelto MySQL solo perché “lo conoscono tutti”. Di fronte a query JSONB complesse che impiegavano minuti per completarsi, il confronto oggettivo era mancato. Oggi vediamo le differenze reali per scegliere in modo consapevole nel 2026.
Prerequisiti / Ambiente di test
Per riprodurre i test e le configurazioni citate, serve un ambiente Linux con:
- PostgreSQL 16 o 17
- MySQL 8 o 9
- 4 vCPU e 8 GB di RAM come baseline
- Dataset di test con almeno 1 milione di righe per valutare performance e indici
Architettura — differenze fondamentali
PostgreSQL e MySQL dividono il mercato dei database relazionali open source, ma le loro architetture interne sono profondamente diverse.
PostgreSQL utilizza un modello process-per-connection. Ogni client che si connette genera un processo OS separato. Questo garantisce isolamento e stabilità, ma consuma più memoria. In un ambiente con 2.000 connessioni attive, serve un connection pooler come PgBouncer per evitare di esaurire la RAM.
MySQL adotta un modello thread-per-connection. Ogni connessione è un thread all’interno dello stesso processo. Questo riduce il overhead di memoria e contesto, rendendo MySQL più efficiente quando devi gestire migliaia di connessioni concorrenti su hardware limitato.
La gestione del MVCC (Multi-Version Concurrency Control) è un’altra differenza critica. PostgreSQL implementa l’MVCC mantenendo versioni multiple delle righe nella stessa tabella, richiedendo un VACUUM periodico per recuperare spazio. MySQL con InnoDB gestisce l’MVCC tramite undo log, riutilizzando lo spazio più rapidamente per transazioni brevi.
Secondo il DB-Engines Ranking del 2025, PostgreSQL ha superato MySQL in popolarità relativa per il terzo anno consecutivo, confermando un cambio di paradigma nel mercato.
Performance — chi è più veloce e in quale scenario
Non esiste un database universalmente più veloce. Esiste il database più veloce per il tuo carico di lavoro.
MySQL eccelle nelle operazioni OLTP (Online Transaction Processing) ad alta concorrenza con transazioni brevi e letture semplici. Un’applicazione web che esegue SELECT per singola chiave primaria o UPDATE su righe isolate trae massimo beneficio dall’architettura di InnoDB. Per monitorare lo stato dei buffer e delle transazioni in MySQL:
-- MySQL: performance OLTP
SHOW ENGINE INNODB STATUS;
PostgreSQL brilla sulle query analitiche complesse, le join su tabelle grandi e le operazioni che richiedono piani di esecuzione sofisticati. Il query planner di PostgreSQL è più avanzato e supporta tipi di join e ottimizzazioni che MySQL non implementa.
Nei miei test su un ambiente con 300+ VM, le query di aggregazione su 10 milioni di righe erano in media 3 volte più veloci su PostgreSQL rispetto a MySQL, grazie ai Parallel Sequential Scans e alla migliore stima della selettività.
Tipi di dati — PostgreSQL vince per varietà
La gestione dei tipi di dati è dove PostgreSQL distanzia nettamente MySQL. PostgreSQL supporta oltre 40 tipi di dati nativi, inclusi Array, UUID, Network Address (CIDR, INET), e tipi geometrici.
-- PostgreSQL: tipi avanzati
SELECT data->>'nome' FROM utenti;
CREATE TYPE stato AS ENUM ('attivo', 'inattivo');
In MySQL, per gestire un array devi creare tabelle di appoggio o usare stringhe separate da virgole (una pratica che viola la prima forma normale). Per gli UUID, MySQL li tratta come stringhe o binari, senza l’ottimizzazione nativa che PostgreSQL applica agli indici B-tree.
JSON e dati semi-strutturati
Il supporto JSON è stato il catalizzatore della migrazione che ho seguito. MySQL supporta il tipo JSON dal 5.7, ma PostgreSQL offre un’implementazione superiore con JSONB.
JSONB in PostgreSQL è un formato binario pre-parsato. Questo significa che non devi ri-parsare il documento ad ogni query. Inoltre, PostgreSQL permette di indicizzare qualsiasi chiave all’interno del JSONB usando indici GIN (Generalized Inverted Index).
Quando ho creato l’indice GIN sulla colonna JSONB contenente i log diagnostici di 2.000 workstation, le query sono passate da 4 minuti a 0.3 secondi. MySQL supporta indici su colonne JSON tramite Generated Columns, ma richiede di definire a priori quali chiavi indicizzare, perdendo la flessibilità del JSON.
Full-text search
PostgreSQL include un motore di full-text search nativo basato su tsvector e tsquery. Non è elastico come Elasticsearch, ma copre il 90% delle esigenze di ricerca testuale per applicazioni standard. Supporta dizionari, stemming e ranking nativo.
MySQL offre indici FULLTEXT, ma sono meno flessibili. Funzionano bene per ricerche semplici in inglese, ma il supporto per altre lingue e la personalizzazione degli analyzer sono limitati.
Replication e alta disponibilità
La replica in MySQL è matura e basata su binlog. MySQL Group Replication e InnoDB Cluster forniscono alta disponibilità nativa con failover automatico. La replica è tipicamente asincrona o semi-sincrona.
PostgreSQL utilizza la replica fisica basata su WAL (Write-Ahead Log) per default. La replica logica permette di replicare solo subset di dati. Per l’alta disponibilità, l’ecosistema fa affidamento su strumenti esterni come Patroni o repmgr, che gestiscono failover e routing in modo affidabile.
In un’infrastruttura enterprise, ho implementato Patroni con etcd per gestire un cluster PostgreSQL a 3 nodi. Il failover avveniva in meno di 10 secondi, rispettando gli SLA critici.
Licensing e community
La licenza è un fattore spesso sottovalutato. PostgreSQL utilizza la PostgreSQL License, una licenza stile MIT/BSD. Puoi fare qualsiasi cosa: modificare, distribuire, incorporare in prodotti commerciali senza restrizioni.
MySQL è sotto GPL v2, ma Oracle possiede il copyright. Se hai bisogno di plugin enterprise come il Thread Pool o l’autenticazione PAM, devi acquistare una licenza commerciale. Il 48% degli sviluppatori usa PostgreSQL contro il 40% di MySQL, secondo la Stack Overflow Developer Survey 2025, e la community di PostgreSQL è tra le più attive nello sviluppo di estensioni.
Hosting e cloud (AWS RDS, Google Cloud SQL)
Sia PostgreSQL che MySQL sono pienamente supportati su AWS RDS, Google Cloud SQL e Azure Database. Le differenze principali riguardano le estensioni.
Su AWS RDS per PostgreSQL, puoi abilitare estensioni come PostGIS per il GIS o pg_trgm per la ricerca fuzzy direttamente dalla console. Su RDS per MySQL, le estensioni sono più limitate e controllate da Oracle.
I costi cloud sono comparabili per istanze simili, ma PostgreSQL richiede spesso meno storage per dati complessi grazie alla compressione TOAST, riducendo i costi su database di grandi dimensioni.
Quando scegliere PostgreSQL
Scegli PostgreSQL quando:
- Devi gestire dati semi-strutturati (JSONB) con query complesse
- La tua applicazione usa tipi di dati specializzati (Array, UUID, GIS)
- Hai query analitiche pesanti e piani di esecuzione complessi
- Ti serve full-text search nativo senza aggiungere stack esterno
- Vuoi una licenza completamente libera da vincoli commerciali
Quando scegliere MySQL
Scegli MySQL quando:
- Hai carichi OLTP ad alta concorrenza con transazioni brevi
- La tua applicazione esegue prevalentemente letture semplici per chiave primaria
- Usi un CMS come WordPress o framework ottimizzati per MySQL
- Il team ha forte expertise MySQL e non ha esigenze di dati complessi
- Hai migliaia di connessioni concorrenti su hardware con poca RAM
Tabella riepilogativa
| Criterio | PostgreSQL | MySQL |
|—|—|—|
| JSONB | Eccellente (indicizzazione GIN) | Buono (Generated Columns) |
| OLTP semplice | Buono | Eccellente |
| Analisi complessa | Eccellente | Buono |
| Tipi di dati | 40+ nativi | Base |
| Full-text | Avanzato (tsvector) | Base (FULLTEXT) |
| Licenza | MIT-like (libera) | GPL + Commerciale |
| Estensioni | Migliaia (PostGIS, pg_trgm) | Limitate |
| Connection handling | Processi (serve PgBouncer) | Thread (nativo) |
Errori comuni e troubleshooting
- Trattare PostgreSQL come MySQL: Dimenticare il VACUUM in PostgreSQL porta a table bloat. Configura l’autovacuum in modo aggressivo su tabelle con molti UPDATE/DELETE.
- Usare MyISAM in MySQL: MyISAM non supporta le transazioni e corrompe i dati su crash. Usa sempre InnoDB.
- Ignorare il connection pooling in PostgreSQL: Avviare 2.000 connessioni dirette a PostgreSQL esaurisce la RAM. Usa PgBouncer in modalità transaction pooling.
- Indicizzare tutte le chiavi JSONB: Gli indici GIN sono pesanti da aggiornare. Crea indici solo sulle chiavi effettivamente usate nelle query WHERE.
FAQ — Domande Frequenti
Qual è la differenza principale tra PostgreSQL e MySQL nel 2026?
PostgreSQL usa processi per connessione e offre tipi di dati avanzati nativi, JSONB superiore e licenza libera. MySQL usa thread, è più veloce su OLTP semplice ma ha limitazioni sui dati complessi e il dual-licensing Oracle.
Come scegliere tra PostgreSQL e MySQL per un’applicazione web?
Se l’applicazione esegue CRUD semplici su un CMS, MySQL è più che sufficiente e consuma meno risorse. Se l’applicazione gestisce dati variabili, log JSONB, o richiede analisi in tempo reale, PostgreSQL è la scelta corretta.
È difficile migrare da MySQL a PostgreSQL?
La migrazione richiede attenzione. La sintassi DML è simile, ma i tipi di dati, l’auto-increment (SERIAL vs AUTO_INCREMENT) e le funzioni di sistema differiscono. Strumenti come pgLoader automatizzano gran parte del lavoro.
Conclusioni con takeaway operativi
La scelta tra PostgreSQL e MySQL nel 2026 non si basa su quale sia “migliore” in assoluto, ma su quale gestisce meglio i tuoi dati specifici. Ho visto organizzazioni bloccate da MySQL per scelte dettate dall’abitudine, e altre che hanno complicato la vita usando PostgreSQL per semplici blog.
Tre takeaway operativi:
- Se i tuoi dati sono complessi o semi-strutturati, PostgreSQL con JSONB e GIN index è la soluzione più efficiente.
- Se hai un carico OLTP ad alta concorrenza con query semplici, MySQL con InnoDB ti dà più performance con meno risorse.
- Valuta la licenza: se vuoi evitare qualsiasi vincolo commerciale futuro, la PostgreSQL License è la scelta più sicura.
Leggi anche: PostgreSQL Indici Quando Usare: Guida Performance (2026)
Leggi anche: PostgreSQL Query Lente: Trovare e Ottimizzare (2026)
Leggi anche: PostgreSQL Backup pg_dump: Guida Completa al Restore (2026)
Riferimenti ufficiali: PostgreSQL Documentation
Aggiornato: Maggio 2026