Cosa fare per usare innodb

Ciao Gianni

Potresti darmi notizie sull'uso evoluto delle tabelle usando innodb ?

By Luca  O0

P.s Ti ringrazio per la risposta del post precedente a questo

inviato 11 anni fa
odino
X 0 X

Una delle peculiarità di MySQL è quella di avere un approccio "modulare" nella gestione del sistema di memorizzazione dei dati su disco. Da un lato le tabelle vengono mostrate all'untente come una entità astratta, nella quale inserire, estrarre, modificare e cancellare record. Dall'altro le tabelle possono essere memorizzate su disco in diversi modi, ciascuno con le sue peculiarità. Esistono ad esempio le tabelle MyISAM, InnoDB, Archive, Merge, BDB, ecc.

Le due nature di una tabella (astratta per l'utente, concreta per il supporto di memorizzazione) non sono perfettamente scorrelate. Anzi ogni funzionalità astratta offerta all'utente deriva in realtà da una concreta organizzazione dei dati su disco. Per questo motivo i diversi tipi di tabella offrono, accanto alle normali funzionalità,  diverse caratteristiche peculiari. Pertanto quando si deve scegliere di usare un tipo di tabella bisogna individuare le esigenze da soddisfare e cercare la tecnologia che risulta essere migliore.

Le tabelle più comunemente utilizzate sono le MyISAM e le InnoDB. Le prime si distinguono per le prestazioni (anche se questo non è sempre vero) mentre le seconde per il supporto alle transazioni e all'integrità referenziale (FOREIGN KEY)

Come regola generale, sicuramente frettolosa, si può dire che le tabelle MyISAM sono da preferire in tutti i casi in cui si possa fare a meno delle transazioni e delle foreign key. In caso contrario bisogna adottare le tabelle InnoDB

La scelta di un tipo di tabella rispetto ad un'altro va fatta al momento della creazione della tabella. Ecco le sintassi possibili:

CREATE TABLE nome_tabella (...) ENGINE=InnoDB;

CREATE TABLE nome_tabella (...) TYPE=InnoDB;

Al posto di InnoDB avremmo potuto mettere un altro tipo di tabella, ad esempio MyISAM

Se nella CREATE TABLE non viene specificato il tipo di tabella verrà creata una tabella seguendo il tipo di default che spesso è MyISAM

E' possibile anche cambiare tipo ad una tabella esistente. Ecco la query:

ALTER TABLE nome_tabella ENGINE=INNODB

Oppure si può creare una nuova tabella identica a quella di partenza ma che usa un sistema differente di memorizzazione e poi travasare tutti i dati:

INSERT INTO nuova_tabella SELECT * FROM vecchia_tabella

Due parole sulle transazioni e sulle chiavi esterne (si potrebbe scrivere un libro...):

Una transazione è un'operazione che prevede l'esecuzione di diverse query. L'intera operazione andrà a buon fine solo se le singole fasi che la compongono (associate alle singole query) avranno tutte esito positivo. Se qualcosa va storto bisogna che il database dimentichi tutto quello che è successo dall'inizio della transazione e torni nel suo stato di partenza.

Ad esempio una procedura per la prenotazione di una vacanza prevede diverse operazioni: prenotazione del viaggio di partenza, prenotazione dell'albergo, prenotazione del viaggio di ritorno. Immagina che serva una INSERT per ciascuna prenotazione. Nel momento in cui andiamo a prenotare il viaggio di ritorno scopriamo che non ci sono posti sull'aereo e pertanto la vacanza non si può fare. A questo punto è necessario che il DB dimentichi le prime due INSERT, ovvero le prime due prenotazioni.

Con le tabelle InnoDB è possibile dire a MySQL che  è iniziata una transazione (BEGIN), poi si effettuano le diverse query. Se tutto va bene comunichiamo a MySQL di rendere persistente il risultato (COMMIT) altrimenti gli diciamo di annullare tutti gli effetti delle precedenti query (ROLLBACK)

Le chiavi esterne sono delle informazioni aggiuntive che vengono fornite a MySQL per spiegare il rapporto logico che c'è tra i dati di 2 tabelle. Inoltre queste informazioni possono indicare a MySQL come comportarsi nel caso vengano manipolati (modificati, cancellati) i dati di una tabella legati a dati di altre tabelle.

Immagina di avere 2 tabelle, una che contiene l'elenco degli studenti ed un'altra contenente gli esami superati. Ovviamente la seconda tabella avrà un campo che identifica lo studente che ha superato l'esame. Questo studente dovrà essere presente nella prima tabella: ecco il legame tra le due tabelle.

Ora è chiaro che non posso inserire un esame nella seconda tabella riferendomi ad uno studente inesistente, voglio che MySQL mi restituisca un errore!

Supponiamo ora che uno studente abbandoni gli studi. Vorrei cancellarlo dalla prima tabella e sarebbe comodo che tutti i suoi esami fossero cancellati dalla seconda tabella automaticamente. Anche questa cosa può essere realizzata da MySQL se all'atto della creazione delle tabelle gli abbiamo esplicitamente detto di comportarsi in questo modo.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ho letto ciò che hai scritto ed è interessante però non ho capito se per usare innodb è sufficiente creare delle tabelle dichiarando il tipo di tabella che deve creare oppure è necessario scaricare o configurare qualcosa, te lo chiedo perchè ho letto che bisogna creare un file denominato "my.cnf" ed effettuare delle configurazione per usare innodb in modo produttivo.

Puoi darmi delle delucidazioni indicandomi magari dove posso attingere informazioni possibilmente in lingua italiana.

Come al solito, grazie

By Luca :crazy:

risposto 11 anni fa
odino
X 0 X

Se stai usando una versione recente di MySQL (es. 4.1.x) allora le tabelle InnoDB sono già abilitate. Ti basta quindi fare ciò che ho scritto nel precedente post.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Mi puoi indicare quali sono i comandi che si possono usare con innodb ?

By Luca 8)

risposto 11 anni fa
odino
X 0 X

Per le transazioni te li ho indicati tra parentesi nell'esempio della prentotazione della vacanza. Comunque ti riepilogo i comandi, si tratta di normalissime query (quindi possono essere lanciate dalla classica mysql_query()):

per iniziare una transazione:

BEGIN oppure START TRANSACTION

per concludere e rendere persistenti le query effettuate:

COMMIT

per concludere ed annullare tutte le query effettuate dalla transazione:

ROLLBACK

Per le foreign key invece la sintassi riguarda principalmente la creazione delle tabelle. Ecco l'esempio degli studenti e degli esami:

CREATE TABLE studenti (
            studente_id int(11),
            nome varchar(64),
            cognome varchar(64),
            PRIMARY KEY (studente_id)
          ) ENGINE=InnoDB;

CREATE TABLE esami (
          esame_id int(11),
          studente_id int(11),
          voto int(11),
          PRIMARY KEY (esame_id),
          FOREIGN KEY (studente_id) REFERENCES studenti (studente_id)
             ON DELETE CASCADE
             ON UPDATE CASCADE
        ) ENGINE=InnoDB;

con la riga

FOREIGN KEY (studente_id) REFERENCES studenti (studente_id)

viene dichiarato il legame tra le colonne delle 2 tabelle, mentre con le righe

ON DELETE CASCADE

ON UPDATE CASCADE

dico a MySQL di propagare (CASCADE) sulla tabella esami le operazioni di modifica e cancellazione fatte sulla tabella studenti

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Salve

Io so che le tabelle in stila InnoDB supportano le foregin key.

Io sto utilizzando la versione 5.0.18-win32 di MySQL e facendo alcune prove ho notato che quando creo le

tabelle contenenti  chiavi esterne,se non dichiaro alla fine  TYPE=InnoDB,il sistema non mi da errori,cioè crea

correttamente le tabelle.

In questo modo come faccio a sapere se veramente si è tenuto conto delle chiavi esterne?O devo dichiarare

sempre TYPE=InnoDB alla termine della creazone della tabella contententi chiavi esterne?

Come si verifica se la tabella InnoDB è attivata?

Vi sarei proprio grato se mi rispondeste...

Arrivederci

 

risposto 10 anni fa
flaky
X 0 X

MySQL non da errore se si tenta di creare delle foreign key su tabelle che non le supportano.

Per sapere il tipo di tabelle contenute in un DB basta lanciare la query:

show table status from nome_del_db

Quando si crea una tabella, se non si specifica il tipo (MyISAM, InnoDB, ecc.) verrà usato il tipo di default, modificabile dal file di configurazione. Per scoprire qual'è il tipo di default puoi eseguire questa query:

show variables like 'table_type'

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Mi sono accorto che hai aperto un'altra discussione sullo stesso tema pertanto chiudo questo thread.

:chiuso:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda