In una delle lezioni precedenti, quando si è parlato della creazione di tabelle, abbiamo incontrato la parola chiave ENGINE
:
CREATE TABLE Persone
(...)
ENGINE=InnoDb
In questo caso il codice definirebbe la tabella denominata Persone, con engine InnoDB. Semplicisticamente, si potrebbe pensare agli Storage Engine come i "tipi" delle tabelle. In realtà, essi sono delle librerie (prodotte congiuntamente al DBMS o da enti terzi) che determinano il modo in cui i dati di quella tabella saranno salvati su disco, e ciò sarà determinante per valutare le prestazioni, l'affidabilità, le funzionalità offerte dalla tabella stessa, rendendola più o meno adatta a particolari utilizzi.
A partire dalla versione 5.5 di MySQL, InnoDB è lo Storage Engine di default, ossia quello assegnato automaticamente qualora, in fase di creazione della tabella, non si specifichi il parametro ENGINE
.
Per sapere quali storage engine sono a disposizione della propria installazione del DBMS, possiamo eseguire, tramite il client testuale mysql, il seguente comando:
SHOW ENGINES;
L'output mostrerà una tabella stilizzata che elenca tutti gli engine a disposizione e le principali funzionalità che li caratterizzano. In particolare, il campo Support sarà valorizzato con YES
, NO
o DEFAULT
. I primi due valori specificano se lo storage engine può essere usato o no, l'ultimo indica se l'engine è quello di default.
In base alle proprie necessità, è possibile modificare lo Storage Engine di default:
SET storage_engine=MyISAM;
Il comando precedente fa sì che lo Storage Engine MyISAM
SHOW ENGINES
InnoDB
InnoDB è lo Storage Engine di default di MySQL. Lo scopo di InnoDB è quello di associare maggiore sicurezza (intesa soprattutto come consistenza ed integrità dei dati) a performance elevate.
Consistenza dei dati e velocità di elaborazione spesso possono contrastare, in quanto la prima proprietà necessita di applicare opportuni lock sui dati durante le modifiche, per evitare che altre richieste vi accedano; d'altro canto, per ottenere una maggiore velocità di elaborazione è richiesto che vengano servite contemporaneamente più richieste, agevolando la concorrenza.
Nell'ottica di perseguire tali finalità, InnoDB è stato arricchito di alcune funzionalità peculiari:
- supporto alle transazioni
-
FOREIGN KEYS
: conferiscono la possibilità di creare una relazione logica tra i dati di due tabelle, in modo da impedire modifiche all'una che renderebbero inconsistenti i dati dell'altra; - lock a livello di riga shared esclusivo
- MVCC M C C
- clustered indexes
La dimensione di una tabella InnoDB può raggiungire i 64 TB, un valore inferiore a quello ammesso da altri Storage Engine.
MyIsam
Per molto tempo MyISAM è stato lo Storage Engine di default, finché non ha dovuto lasciare il passo alle ricche caratteristiche di InnoDB. Le tabelle che usano questo Storage Engine possono raggiungere dimensioni di 256 TB e vengono salvate su disco divise in tre file differenti: uno di estensione .frm che contiene il formato della tabella, uno .MYD che contiene i dati, ed un ultimo, .MYI, che contiene gli indici.
Questo engine attualmente presenta performance ridotte a causa del lock eseguito a livello di tabella. Ciò è particolarmente evidente quando si tratta di tabelle soggette indifferentemente ad operazioni di lettura e scrittura. Al contrario, tale effetto negativo è ridotto se la tabella è read-only o comunque modificata molto raramente. Per queste ultime casistiche, MyISAM appare ancora un'opzione accettabile.
L'ampio uso fatto negli anni delle tabelle MyISAM ne ha dimostrato abbondantemente la loro affidabilità. Tuttavia, può capitare che esse risultino corrotte e, di conseguenza, non più leggibili. Ciò può accadere a seguito di circostanze particolari seppur piuttosto rare: guasti hardware, interruzioni improvvise del demone mysqld, spegnimento inatteso della macchina ospite. Tabelle MyISAM danneggiate possono essere controllate e riparate con i seguenti strumenti:
-
i comandi
CHECK TABLE
REPAIR TABLE
- lo strumento myisamchk
Memory
Questo storage engine ha la caratteristica di non salvare i dati in maniera persistente su disco, ma di mantenerli in memoria. La conseguenza sarà di avere a disposizione tabelle molto veloci, ottime come supporto allo svolgimento di operazioni piuttosto lunghe. Al contrario, non è utilizzabile per il salvataggio duraturo dei dati. Il loro utilizzo si è ridotto nel tempo grazie ad un'altra caratteristica molto importante di InnoDB, che consiste nell'utilizzare come cache un buffer pool in memoria per agevolare operazioni di lettura che coinvolgono grandi quantità di dati. L'avvertenza doverosa nei confronti di Memory, che rimane comunque una tecnologia molto utile, è di non far assumere a questo tipo di tabelle dimensioni eccessive, che potrebbero penalizzare le prestazioni dell'intero DBMS.
Archive
Lo storage engine Archive risponde all'esigenza di conservare nel tempo grandi moli di dati, non più aggiornate ma archiviate solo a carattere “storico” o per eventuali analisi future (per esempio nel caso dei log di sistema). Tabelle di questo tipo permettono solo operazioni di SELECT
ed INSERT
e non possono avere campi indicizzati, ma hanno il vantaggio di occupare meno spazio, in quanto compresse con zlib.
TokuDB
TokuDB è un nuovo Storage Engine per MySQL/MariaDB sviluppato da Percona, creato per diventare il sostituto di InnoDB con un occhio al mondo del big data. Esso ha alcune funzionalità comuni a InnoDB, come la possibilità di modificare le tabelle dopo la creazione con nuovi indici, nonchè quella di aggiungere ed eliminare campi, il supporto pieno alle transazioni e quello a MVCC. Manca invece il supporto alle foreign keys esplicite.
La caratteristica che lo differenzia dagli altri Storage Engine è l'utilizzo di un indice ad albero frattale che permette:
- prestazioni aumentate in scrittura e lettura (fino a 20 volte superiori a InnoDB senza operazioni di tuning particolari);
- teoricamente l'eliminazione dei lag nella replicazione verso server slave;
- marcato risparmio di spazio su disco (fino ad un livello di compressione 25 volte maggiore rispetto a InnoDB).
- CSV
- Blackhole /dev/null
- Merge Federated aggregazione
- Example
- NDB Cluster cluster di database
Negli ultimi anni TokuDB sta riscuotendo molto successo, ed alcuni sistemi hanno iniziato ad includerlo di default nelle proprie distribuzioni. Ad esempio, MariaDB viene rilasciato con questo Storage Engine disabilitato ma pronto per essere abilitato dal file di configurazione.
Ulteriori storage engine
Esistono molti altri storage engine, non sempre frequenti nell'uso ma particolarmente utili se impiegati negli ambiti per cui sono stati progettati: