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:
- 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.
- 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.