News

24/02/2022

Le 10 principali differenze tra PostgreSQL e MySQL

Per molti anni MySQL ha dominato la scena dei DBMS (Database management system), soprattutto per il fatto che fosse utilizzato da CMS come Wordpress e Joomla. CMS molto utilizzati da parte di aziende ed enti pubblici per la realizzazione dei propri siti web.

Negli ultimi tempi però l'utilizzo di PostgreSQL sta crescendo in modo esponenziale [1] [2] [3], grazie alle diverse opportunità offerte soprattutto in termini di funzionalità e performance. Infatti, molte grandi aziende e banche stanno migrando verso PostgreSQL.

Vediamo in dettaglio che cosa rende diversi i due sistemi di gestione dei database.

Quali sono le principali differenze tra MySQL e PostgreSQL?

1) Architettura

MySQL è un sistema di gestione database relazionale classico, che richiede di convertire le informazioni da un linguaggio SQL a una struttura ad oggetti, ad esempio quando lavoriamo con PHP che è linguaggio di programmazione ad oggetti.

Invece PostgreSQL lavora già con gli oggetti: si tratta di un approccio molto diverso in fase di progettazione, perché su PostgreSQL i dati sono organizzati come se fossero degli oggetti e questo permette un risparmio in termini di tempo e di risorse.

Per provare a capire meglio la differenza, su PostgreSQL anche le tabelle, i record e i campi sono considerati degli oggetti. Diversamente invece su MySQL le varie entità sono messe in relazione tra loro incrociando le differenti tabelle tra cui INFORMATION_SCHEMA che raccoglie i dati come i tipi di colonna e i nomi delle tabelle.

2) Ereditarietà delle tabelle

PostgreSQL permette di ereditare le tabelle, in pratica nel caso di tabelle molto simili potremmo creare una prima tabella che funzionerà da "macro" e le successive tabelle erediteranno le proprietà della prima

Ad esempio, potremmo avere due tabelle, una per città e una per capoluoghi. La tabella "Capoluoghi" erediterà le proprietà della tabella "Città":

CREATE TABLE citta (
 id INTEGER,
 nome TEXT,
 popolazione INTEGER
);

CREATE TABLE capoluoghi (
 regione INTEGER
) INHERITS (citta);

Questo con MySQL non è possibile, poichè MySQL non supporta la table inheritance.

3) Le transazioni

MySQL veniva usato principalmente con un engine (motore) chiamato MyISAM che non supporta le transazioni. Con il tempo si è diffuso sempre più InnoDB che tra le altre cose permette di eseguire le transazioni.

D'altro canto però PostgreSQL usa le transazioni da molto più tempo, quindi permette di eseguire sia i comandi di COMMIT che di ROLLBACK. Questo rende PostgreSQL più affidabile dal punto di vista della gestione e dell'integrità dei dati.

4) Engine

Come accennato, MySQL un tempo utilizzava il motore MyISAM per poi passare, dalla versione 8.0, al motore InnoDB che è molto più affidabile. Una pecca da sottolineare però è che InnoDB è di proprietà di Oracle, che successivamente ha acquistato anche MySQL stesso. Il software rimane comunque open-source, ma questo non può che porre delle riflessioni nel caso Oracle decidesse di rendere MySQL un software closed-source.

In ogni caso per MySQL sono disponibili più motori detti "storage engine", che permettono di lavorare con approcci diversi. Per fare un esempio InnoDB supporta le chiavi esterne mentre MyISAM no, una differenza notevole [4]!

PostgreSQL utilizza un solo engine, o per meglio dire, non ha engine diversi tra cui scegliere. Questo gli permette di essere un sistema ben collaudato e mantenuto nel tempo, anche se con delle limitazioni che potrebbero essere risolte prendendo spunto da altri sistemi, come riconosciuto da PostgreSQL. È comunque allo studio un nuovo storage engine chiamato zheap che potrebbe essere il futuro per PostgreSQL.

5) Licenza

MySQL è un software libero sotto la licenza GNU General Public License (GPL), ma è di proprietà di Oracle. In pratica, è un prodotto.

PostgreSQL è anch'esso un software libero con licenza open-source, ma è un progetto di proprietà della comunità e l'impegno del team che ci lavora è proprio quello di mantenere questa filosofia.

6) Prestazioni

MySQL funziona tramite un programma a singolo processo in multithreading, mentre invece PostgreSQL funziona con più processi in multithreading soprattutto quando deve eseguire delle query in parallelo.

Questo rende PostgreSQL un punto di riferimento in termini di prestazioni quando si tratta di gestire un database.

Bisogna anche riconoscere però a MySQL di aver fatto grandi passi in avanti nel tempo per incrementare le performance, in particolare grazie al passaggio da MyISAM a InnoDB.

In ogni caso, la scelta sul sistema da usare deve essere contestualizzata: per esempio, PostgreSQL risulta essere più veloce quando si ha a che fare con dati di tipo NoSQL/JSON (guarda il confronto). Ci sono anche altri casi di benchmarking in cui PostgreSQL risulta molto migliore di MySQL così come altri traggono conclusioni opposte.

Le impressioni che si hanno in generale sono che PostgreSQL sia più rapido nell'eseguire query complesse, mentre MySQL vinca quando si tratta di sola lettura di dati [5] [6].

7) Standard SQL

PostgreSQL ci tiene molto a rispettare gli standard del linguaggio SQL, mentre MySQL, pur cercando di essere il più conforme possibile, preferisce non sacrificare velocità e affidabilità.

Per citare la documentazione di MySQL:

"One of our main goals with the product is to continue to work toward compliance with the SQL standard, but without sacrificing speed or reliability. We are not afraid to add extensions to SQL or support for non-SQL features if this greatly increases the usability of MySQL Server for a large segment of our user base. The HANDLER interface is an example of this strategy."

8) Sicurezza

PostgreSQL ha un sistema di gestione dei permessi molto granulare grazie ai ruoli.

MySQL invece funziona con un sistema ACL (Access Control List) che richiede di assegnare ad ogni utente uno specifico permesso ad esempio di lettura o scrittura.

I ruoli permettono di avere un'organizzazione più flessibile e più facile da configurare per quanto riguarda l'assegnazione di determinati poteri ad un utente. Questo per permettergli di effettuare, tra le altre operazioni, quella di lettura o scrittura sul database. Assegnando più ruoli ad un utente possiamo avere un maggiore controllo su quello che può fare, anziché dovergli assegnare singoli permessi di volta in volta.

9) Personalizzazioni ed estensioni

PostgreSQL può essere personalizzato ed esteso grazie al suo sistema flessibile ed estendibile. Permette di creare tipi di dati personalizzati tramite i comandi CREATE DOMAIN e CREATE TYPE, ma anche funzioni, tipi di indici, e altro.

MySQL invece è molto più ristretto su questo. È possibile ad esempio aggiungere delle funzionalità con il comando CREATE PROCEDURE, ma di base non è possibile aggiungere facilmente dei nuovi tipi di dato, che in alcuni casi potrebbe essere invece molto utile!

10) Ricerche testuali

PostgreSQL ha un miglior supporto per le ricerche testuali, soprattutto le cosiddette full text search, permettendo di fare ricerche avanzate in diverse lingue e con la possibilità di dare un peso (ranking) diverso alle parole cercate.

In particolare, su PostgreSQL esistono dei veri e propri tipi di dato dedicati alle ricerche testuali, che sono tsvector e tsquery (dove ts sta per text search) oltre a diverse funzioni dedicate. Questo permette così al gestore del database di avere una maggiore flessibilità e una più ampia possibilità di personalizzazione nelle ricerche.

Anche MySQL supporta le ricerche testuali ma funzionano tramite degli indici chiamati FULLTEXT che vanno creati sulle colonne di tipo testuale, quindi è un approccio molto diverso e meno flessibile.

Entrambi i sistemi sono collegabili con ElasticSearch, ad esempio tramite logstash oppure usando delle apposite librerie Python o delle estensioni come zombodb.

Le funzionalità di PostgreSQL sulle ricerche testuali sono molto più solide e consolidate rispetto a MySQL, che comunque ha fatto molti passi in avanti nel corso del tempo.

Chi usa MySQL e chi usa PostgreSQL?

Alcuni esempi possono far capire il potenziale di entrambi i sistemi, di seguito abbiamo elencato alcune tra le più importanti aziende che usano i due diversi DBMS.

MySQL è usato da:

  • Facebook
  • Pinterest
  • Netflix
  • Amazon
  • Twitter

PostgreSQL è usato da:

  • Apple
  • IMDB
  • Instagram
  • Reddit
  • Twitch

Lavoriamo con DBMS PostgreSQL dal 1996. La nostra esperienza ci ha portati ad essere un importante punto di riferimento in Italia per questo sistema di gestione dei database.

Abbiamo lavorato ad oltre 600 progetti web con DBMS PostgreSQL, ottenendo sempre i migliori risultati in termini di prestazioni e funzionalità.

Grazie al nostro servizio di assistenza PostgreSQL forniamo:

  • Consulenza e assistenza nell'uso di PostgreSQL
  • Migrazione di un database PostgreSQL
  • Backup di un database e dei dati memorizzati
  • Recupero di un database PostgreSQL corrotto
  • Procedure di disaster recovery
  • Trasferimento da un database MySQL, Access, o altri DBMS su PostgreSQL


Fonti dell'articolo:

  1. Timescale: If PostgreSQL is the fastest growing database, then why is the community so small?
  2. PostgreSQL is the DBMS of the Year 2018
  3. Grafico di crescita della popolarità dei vari DBMS
  4. Tabella delle funzionalità di MyISAM
  5. 2ndQuadrant: Confronto performance tra MySQL e PostgreSQL
  6. Differenze nelle performance tra MySQL e PostgreSQL
  7. Percona: PostgreSQL and MySQL: Millions of Queries per Second