Lezione Precedente

Laboratorio di Sistemi Informativi

Tipi di tabelle in MySQL

Tabelle temporanee

In MySQL è possibile creare delle tabelle temporanee. Sono delle tabelle che vengono create e vivono solo per una sessione di lavoro (ovvero il tempo intercorrente tra una mysql_connect e una mysql_close, oppure una singola esecuzione del monitor di MySQL). Alla fine della sessione, la tabella viene eliminata. Non solo, ma la tabella creata è visibile solo  all'interno di quella sessione: altre sessioni attive non vedono la tabella, anzi, possono addirittura crearne un'altra con lo stesso nome, e le due rimangono oggetti separati.

Tutti gli utenti che hanno il privilegio CREATE TEMPORARY TABLES possono creare una tabella temporanea con il comando CREATE TEMPORARY TABLE, che ha la stessa sintassi di CREATE TABLE. Ad esempio:

CREATE TEMPORARY TABLE temp (
    valore int
);

A questo punto si usa esattamente come una tabella normale...  o quasi. I comandi manipolazione dei dati funzionano normalmente, ma, ad esempio, temp non appare nell'elenco delle tabelle che si ottiene con SHOW TABLES !!! Se inoltre apriamo un'altra finestra con il client MySQL, la tabella temp non è visibile, e un comando SELECT  * FROM TEMP restituisce l'errore:

ERROR 1146: Table 'test.temp' doesn't exist


È possibile, in quest'altra finestra, creare una nuova tabella temporanea di nome temp e riempirla con valori differenti di quelli che possiede nell'altra sessione.

Le tabelle temporanee sono di solito usate per tenere temporaneamente i risultati di una query complessa, in modo da poter riaccedere ai dati successivamente, nell'ordine che si preferisce. Nelle vecchie versioni di MySQL erano utilizzate anche per sopperire alla mancanza delle select annidate.

Tabelle di tipo MEMORY

Una tabella temporanea è comunque una tabella che viene tenuta memorizzata su disco. Invece di memorizzarla nella directory dati di mysql  (/var/lib/mysql nel nostro caso) viene memorizzata in una directory dedicata ai file temporanei (/tmp) e da lì viene automaticamente cancellata quando non serve più. Per tabelle piccole, come quelle che usiamo nei nostro script per AIRdb, può essere molto più conveniente tenere la tabella in memoria centrale, in modo ridurre le operazioni di accesso al disco del server database.

A questo scopo, è possibile indicare un "motore" diverso per ogni tabella con il comando CREATE TABLE o CREATE TEMPORARY TABLE. Il "motore" specifica la tecnica di memorizzazione :

CREATE TABLE <nometabella> (
    ....
) ENGINE=<tipo>

Il motore di default, usato quando non si specifica nulla, è MyISAM. Se si usa come motore MEMORY, invece, la tabella verrà lasciata in memoria centrale (sotto forma di tabella hash). La tabella di tipo MEMORY ha alcune limitazioni dovute alla sua implementazione peculiare. Ad esempio non si possono usare campi di tipo TEXT.

Per il resto, una tabella di tipo MEMORY si usa normalmente, ma ovviamente occorre ricordarsi che, non essendo memorizzata su disco, quando il server di database termina anche il contenuto della tabella viene perso. Attenzione però, la tabella continua comunque ad esistere anche se vuota. Inoltre, il contenuto di una tabella MEMORY, come per una tabella MyISAM, è condiviso tra tutte le sessioni MySQL attive. Non si tratta quindi di una tabella temporanea, come si ottiene invece col comando CREATE TEMPORARY TABLE.

È tuttavia possibile creare una tabella temporanea di tipo MEMORY con

CREATE TEMPORARY TABLE <nometabella> (
    ....
) ENGINE=MEMORY

In questo caso si ottiene una tabella temporanea il cui contenuto è memorizzato in memoria centrale. Essa è quindi particolarmente adatta per memorizzare temporaneamente dei dati, ed è per questo motivo che la utilizziamo nello script pubblico.php nell'applicazione AIRdb.

ATTENZIONE. Nelle versioni precedenti di MySQL, il motore MEMORY si chiamava HEAP.

Il tipo di tabella InnoDB

Finora abbiamo visto due possibili motori per le tabelle, il motore MEMORY e il motore MyISAM. Un altro motore molto importante in MySQL è InnoDB. Le tabelle InnoDB supportano infatti una serie di caratteristiche non previste dalle tabelle MyISAM. In particolare:
  1. vincoli di chiave esterna. È possibile specificare che un campo della tabella T1 è chiave esterna per la tabella T2, e questo impedisce di creare righe in T1 che non corrispondono a nessuna riga in T2.
  2. gestione delle transazioni. È un metodo alternativo ai blocchi di tabella per gestire la concorrenza e garantire un elevato livello di sicurezza nelle operazioni di scrittura, anche in caso di guasti hardware o di crash del server. Tra l'altro, è un metodo molto più standard dei blocchi di tabella, previsto in tutti i database relazionali commerciali.
A fronte di queste maggiori funzionalità, le tabelle InnoDB sono più lente di quelle MyISAM. Visto che MySQL è orientato ad applicazioni web, per le quali la velocità di risposta è fondamentale e le operazioni sono principalmente di lettura,  gli sviluppatori hanno deciso di adottare come formato di default il MyISAM.

Lezione Precedente