differenza tra le tabelle di tipo myisam e...

32
Configurazione di MySQL 5.0. Tipi di tabelle MySQL . Differenza tra le tabelle di tipo MyISAM e InnoDB (http://www.alessioluffarelli.it/guide_tutorial/database/differenza_innodb_myisam.php ) Il popolare Database Server MySQL dispone di vari tipi di tabelle. Le più usate sono senza dubbio le MyISAM e le InnoDB. MyISAM Sono le tabelle "storiche" di MySQL. Hanno fatto il loro successo grazie alle ottime performace e al ridotto carico sul server che necessitano. Purtroppo però mancano di alcune caratteristiche molto importanti nelle basi di dati; primo fra tutte il mancato supporto alle foreign key (chiavi esterne), grazie alle quali è possibile creare relazioni tra tabelle e applicare il concetto di integrità referenziale. Mancano inoltre del supporto alle transazioni. Mancando il supporto alle transazioni e alle foreign keys solitamente non sono adatte per realizzare sistemi di commercio elettronico o altre applicazioni enterprise. Il tipo di tabella MyISAM è solitamente quello predefinito nel DBMS (nella versione 5.0 il tipo predefinito è InnoDB) Le tabelle di tipo MyISAM si compongono di 3 file con estensioni .frm, .MYD e .MYI. Il primo file contiene la struttura della tabella, il secondo i dati e il terzo gli indici. Questi file si trovano nella cosiddetta datadir, in Windows di default è la sottodirectory data della directory di installazione. La posizione può essere comunque configurata a piacere attraverso il file my.cnf o my.ini. A ciascun database corrisponde una directory con il medesimo nome, all'interno della quale si trovano i file relativi alle singole tabelle. Per trasferire/copiare una tabella da una macchina ad un'altra o da un database ad un altro è sufficiente spostare questi 3 file. - 1 -

Upload: vohanh

Post on 14-Mar-2018

224 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Differenza tra le tabelle di tipo MyISAM e InnoDB

(http://www.alessioluffarelli.it/guide_tutorial/database/differenza_innodb_myisam.php)

Il popolare Database Server MySQL dispone di vari tipi di tabelle. Le più usate sono senza dubbio le MyISAM e le InnoDB.

MyISAM

Sono le tabelle "storiche" di MySQL. Hanno fatto il loro successo grazie alle ottime performace e al ridotto carico sul server che necessitano. Purtroppo però mancano di alcune caratteristiche molto importanti nelle basi di dati; primo fra tutte il mancato supporto alle foreign key (chiavi esterne), grazie alle quali è possibile creare relazioni tra tabelle e applicare il concetto di integrità referenziale. Mancano inoltre del supporto alle transazioni. Mancando il supporto alle transazioni e alle foreign keys solitamente non sono adatte per realizzare sistemi di commercio elettronico o altre applicazioni enterprise.

Il tipo di tabella MyISAM è solitamente quello predefinito nel DBMS (nella versione 5.0 il tipo predefinito è InnoDB)

Le tabelle di tipo MyISAM si compongono di 3 file con estensioni .frm, .MYD e .MYI. Il primo file contiene la struttura della tabella, il secondo i dati e il terzo gli indici.

Questi file si trovano nella cosiddetta datadir, in Windows di default è la sottodirectory data della directory di installazione. La posizione può essere comunque configurata a piacere attraverso il file my.cnf o my.ini. A ciascun database corrisponde una directory con il medesimo nome, all'interno della quale si trovano i file relativi alle singole tabelle.

Per trasferire/copiare una tabella da una macchina ad un'altra o da un database ad un altro è sufficiente spostare questi 3 file.

- 1 -

Page 2: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

- 2 -

In questo modo si copia la tabella tbcomuni (ovvero i 3 file che la compongono)

dal database dbprova al database miodb.

InnoDB

Sono tabelle molto più complete rispetto alle MyISAM ma si sono fatte la nomina di essere più lente a causa delle funzionalità aggiuntive di cui dispongono. Sulla questione delle performance si può, comunque, considerare che la differenza reale di prestazioni tra MyISAM e InnoDB sia divenuta veramente minima.

Tra le caratteristiche a loro vantaggio, invece, vi sono le foreign key e la transazionalità, con le quali è possibile creare una base di dati relazionale e transazionale.

Per trasferire questo tipo di tabelle da un server ad un altro non è sufficiente spostarne i file e questo rende più complicate le procedure di backup. Questo tipo di tabelle, inoltre, non sono sempre disponibili negli hosting economici.

Utilizzo delle tabelle InnoDB (http://www.tevac.com/entropy-ita/software/macosx/mysql/innodb.html) Tratto dal manuale di MySQL : (http://www.mysql.com/documentation/mysql/bychapter/manual_Table_types.html#InnoDB)

InnoDB implementa in MySQL l'utilizzo di tabelle di tipo evoluto: supportano commit e rollback, sono in grado di conservare i dati dopo un eventuale crash, consentono l'uso efficiente e sicuro delle transazioni, supportano il lock delle colonne e consentono la lettura nei SELECT in stile Oracle. Queste caratteristiche migliorano la produttività e l'efficienza nell'uso simultaneo dei data base da parte di più utenti. Poiché il lock a livello di colonne nelle tavole InnoDB occupa pochissimo spazio, non si verificano aumenti grandi di richiesta di risorse. Le tabelle in stile InnoDB supportano, inoltre, le restrizioni FOREIGN KEY, come il tipo principale di tabelle di MySQL.

Page 3: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Tabelle in MySQL, MyISAM vs InnoDB

(http://openskills.info/infobox.php?ID=1412)

MyISAM

Sono le tabelle storiche di MySQL, derivanti direttamente dalle vecchie ISAM che sono dismesse ormai da anni.

Garantiscono indubbiamente un’ottima affidabilità e velocità. Su versione di MySQL più vecchie della 4.1 sono sicuramente da preferirsi alle INNODB.

Forniscono un vantaggio notevole che è dato dalla possibilità di poter utilizzare indici FULLTEXT per ricerche con ranking stile Google.

Il metodo di salvataggio dei dati è basato sulla costruzione e lavorazione di 3 file binari:

Tipo file Descrizione frm Struttura della tabella

MYD File contenente tutti i dati della tabella

MYI File contenente i dati relativi agli indici del database

Per maggiori informazioni: http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html

- 3 -

Page 4: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

INNODB (Default engine di MySQL 5.0)

Sempre più spesso capita di trovare database server le cui tabelle di default utilizzano l’engine INNODB.

Tale scelta è dettata dalla sempre più importanza anche per progetti web di funzionalità che normalmente MySQL con le semplici tabelle MyISAM non fornisce. Vediamo quindi una serie di funzionalità avanzate garantite dalle tabelle INNODB:

* Foreign Key

Le tabelle INNODB sono in grado di gestire l’integrità referenziale tra le chiave esterne del database, in sostanza tale integrità è sempre stata delegata all’abilità dello sviluppatore, ora con il motore INNODB è possibile delegare questa annosa attività a MySQL stesso, potendo quindi specificare vari comportamenti a seconda della chiave esterna utilizzata.

* Transazioni

Le transazioni sono fondamentali in situazioni tipiche da shop online dove sino a che non arriva conferma da parte della banca o di chi valida la carta di credito, le query non devono essere “eseguite realmente”.

Fondamentalmente si tratta di eseguire una serie di query che verranno validate o annullate mediante chiamate COMMIT o ROLLBACK.

* Mancanza – FULLTEXT

Cito ora una mancanza grave nelle tabelle INNODB, l’assenza di poter (almeno per ora) dichiarare un campo come indice fulltext per poter eseguire ricerche con score alla Google.

Queste sono le principali funzionalità aggiuntive di INNODB rispetto a MyISAM.

Per maggiori informazioni consultare il manuale ufficiale di MySQL: http://dev.mysql.com/doc/refman/5.0/en/innodb-overview.html

- 4 -

Page 5: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

COME SCEGLIERE LE TABELLE????

Cercherò ora di dettare due linee guide per stabilire se conviene realizzare tabelle MYISAM o INNODB.

Innanzitutto come sempre dipende dal contesto di applicazione. Una breve premessa sulle performance… a mio parere la velocità dei due motori è pressochè la stessa.

Se necessitiamo di transazioni, supporto all’integrità referenziale perchè dobbiamo realizzare un’applicazione con shop online o un magazzino con carico/scarico (si può fare tutto ciò anche con MyISAM) utilizzerei le tabelle di tipo INNODB, altrimenti utilizzerei le MyISAM in quanto hanno due vantaggi grandissimi, supporto FULLTEXT e soprattutto è possibile fare un backup diretto dei file binari per l’importazione/esportazione della base dati.

Con le tabelle INNODB è invece molto complesso in quanto i dati di TUTTI i database presenti sul server e che utilizzano tabelle INNODB vengono normalmente salvati nel file ibdata1.

Anche volendo salvare i file dei dati ognuno per tabella le transazioni e gli indici vengono comunque salvati nel TABLESPACE e quindi il recovery mediante import di tutti i file presente per esempio sotto: /var/lib/mysql/miodb/ NON FUNZIONA!

- 5 -

Page 6: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Tipi di tabelle

(http://database.html.it/guide/lezione/2443/tipi-di-tabelle/)

MySQL permette di utilizzare numerosi tipi diversi di tabelle, ovvero diversi "storage engine" (motori di archiviazione) per la memorizzazione dei dati. La distinzione più importante fra i diversi sistemi è quella fra transazionali e non transazionali.

I motori transazionali offrono alcuni importanti vantaggi: sono più sicuri (permettono di recuperare i dati anche in caso di crash di MySQL o di problemi hardware) e consentono di effettuare più modifiche e convalidarle tutte insieme o, al contrario, ripristinare la situazione preesistente se qualcosa va male.

Dal canto loro, i motori non transazionali hanno il vantaggio di una maggior velocità, minore utilizzo di spazio su disco e minor richiesta di memoria per gli update. È anche possibile combinare tabelle transazionali e non nelle stesse istruzioni, anche se, in questo caso, le modifiche fatte sulle tabelle non transazionali divengono comunque effettive nel momento in cui sono eseguite.

Quando si crea una tabella si specifica a MySQL di che tipo si tratta attraverso l'opzione ENGINE:

CREATE TABLE tabella (a INT) ENGINE = INNODB;

Nel caso in cui la dichiarazione venga omessa, MySQL utilizzerà il tipo di default, che normalmente è MyISAM.

Tuttavia, se si installa MySQL su Windows attraverso il Configuration Wizard il tipo di default che troverete impostato sarà InnoDB. Potete modificare questo valore intervenendo sull'opzione --default-table-type nel file di configurazione (vedi configurazione di MyQSL).

Se tentate di creare un tipo di tabella non supportato dal vostro database (ad esempio perchè il motore relativo non è incluso nel vostro server oppure perchè lo avete avviato senza quel sistema), MySQL creerà al suo posto una tabella MyISAM.

Vediamo ora una panoramica dei diversi sistemi:

- 6 -

Page 7: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

MyISAM

È lo storage engine di default di MySQL, basato sul vecchio ISAM ora non più supportato.

Ogni tabella MyISAM utilizza tre file: un file .frm che contiene la definizione della tabella, più un file .MYD per i dati e un file .MYI per gli indici.

È possibile indicizzare le colonne di tipo BLOB e TEXT, e si possono utilizzare valori NULL nelle colonne indicizzate. Inoltre MyISAM può gestire una colonna di tipo AUTO_INCREMENT per ogni tabella, incrementando automaticamente il suo valore per ogni riga scritta; i valori eliminati non vengono riutilizzati nemmeno se sono gli ultimi della sequenza. Ogni colonna può utilizzare un set di caratteri diverso.

Le tabelle MyISAM possono avere un formato statico, dinamico o compresso. Il formato statico viene utilizzato quando la tabella non contiene colonne a lunghezza variabile (VARCHAR, BLOB, TEXT) e offre maggior sicurezza e velocità, ma generalmente richiede più spazio su disco. Il formato dinamico invece può portare facilmente ad una frammentazione della tabella (in caso di numerose modifiche o cancellazioni dei dati), nel qual caso è bene periodicamente effettuare un'ottimizzazione attraverso il comando OPTIMIZE TABLE.

Da notare che se una tabella è in formato dinamico, le colonne definite come CHAR vengono convertite in VARCHAR a meno che non abbiano una lunghezza non superiore ai 4 bytes. Il formato compresso infine è utile per generare tabelle a sola lettura che minimizzano l'occupazione di spazio; vengono create attraverso l'utility myisampack.

Nel caso si riscontrino problemi su una tabella, è necessario utilizzare il comando CHECK TABLE per verificare la situazione, e REPAIR TABLE per ripristinare la tabella. MySQL è in grado di risolvere la maggior parte dei problemi con questo sistema.

InnoDB

È uno storage engine transazionale dotato di capacità di commit, rollback e crash recovery. È ottimizzato per l'uso concorrente dei dati fra molti utenti e per essere molto performante anche su grandi quantità di dati. Inoltre supporta le FOREIGN KEY.

Se non usate le tabelle InnoDB, potete avviare il server con l'opzione --skip-innodb. Se invece le utilizzate, dovreste fornire al server le indicazioni sui file da utilizzare per i dati.

Vediamo un esempio di opzioni di configurazione relative a InnoDB sul file delle opzioni:

- 7 -

Page 8: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend:max:500M innodb_buffer_pool_size=70M innodb_additional_mem_pool_size=10M innodb_log_group_home_dir = /iblogs innodb_log_files_in_group = 2 innodb_log_file_size=20M innodb_log_buffer_size=8M innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 skip-external-locking max_connections=200 read_buffer_size=1M sort_buffer_size=1M

innodb_data_home_dir indica la directory per il file dei dati. Se non la indicate, InnoDB utilizza la directory dati di MySQL. Se la indicate vuota, dovete indicare il percorso completo su innodb_data_file_path, che indica i nomi dei file che saranno utilizzati come tablespace. Potete indicarne uno o più: nell'esempio avremo un file ibdata1 di 50 megabytes e un file ibdata2 di 50 megabytes che potrà estendersi fino a 500. L'opzione autoextend può essere indicata solo sull'ultimo file. Tenete presente la dimensione massima dei file sul vostro sistema per indicare il parametro max. Le directory indicate devono esistere, perchè il server non è in grado di crearle.

innodb_buffer_pool_size dovrebbe essere circa la metà della memoria del vostro computer.

innodb_log_group_home_dir è la directory per i file di log. Se non la indicate verrà usata la stessa dei dati.

innodb_log_file_size dovrebbe essere circa il 25% della dimensione del buffer pool. Le altre impostazioni dovrebbero andare bene così come sono.

Se non indicate le impostazioni di configurazione, InnoDB creerà un file dati di 10MB e due file di log da 5MB ciascuno nella directory dati di MySQL.

Abbiamo detto che InnoDB consente l'uso delle transazioni. Ogni connessione al server MySQL inizia in autocommit mode, il che significa che tutte le istruzioni di aggiornamento vengono rese effettive immediatamente. Se disattivate l'autocommit con SET AUTOCOMMIT = 0, le modifiche diverranno operative solo quando eseguite l'istruzione COMMIT. Se al suo posto eseguite ROLLBACK, verranno annullate tutte le modifiche fino alla COMMIT precedente. Potete utilizzare le transazioni senza disattivare l'autocommit, iniziandole con START TRANSACTION o BEGIN e terminandole con COMMIT o ROLLBACK.

InnoDB gestisce il valore AUTO_INCREMENT per una tabella in modo particolare: questo viene infatti calcolato la prima volta che si rende necessario dopo l'avvio del server (ad esempio per una INSERT), selezionando il valore massimo esistente sulla tabella e incrementandolo di 1. A quel punto il valore viene conservato in memoria ma non scritto su disco, per cui al riavvio successivo sarà ricalcolato. Questo significa che se

- 8 -

Page 9: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

cancellate gli ultimi valori della tabella senza fare nuovi inserimenti, al successivo riavvio il server riutilizzerà quei valori.

Con le tabelle InnoDB possiamo definire le foreign key, cioè collegare i valori delle colonne che contengono chiavi di altre tabelle alle tabelle stesse. In questo modo è possibile verificare automaticamente quando i valori della tabella madre vengono modificati o eliminati in modo da impedire queste modifiche o, al contrario, modificare di conseguenza anche i valori sulla tabella figlia. Inoltre non è possibile inserire nella tabella figlia valori che non hanno un corrispondente nella tabella madre. Vediamo un esempio di definizione:

CREATE TABLE madre(id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE figlia(id INT, madre_id INT, INDEX par_ind (madre_id), FOREIGN KEY (madre_id) REFERENCES madre(id) ON DELETE CASCADE ) ENGINE=INNODB;

In questo codice vediamo definite due tabelle nelle quali la tabella figlia ha una foreign key sulla tabella madre. Quando viene cancellata una riga dalla tabella madre, se il valore di id è presente in un campo madre_id della tabella figlia la riga corrispondente viene anch'essa eliminata. Entrambe le tabelle devono essere di tipo InnoDB; entrambe le colonne devono figurare come primo campo di un indice.

È possibile dare un nome alla relazione specificando "CONSTRAINT nome" prima di FOREIGN KEY. Tale nome sarà poi utilizzabile qualora si decida di eliminare la FOREIGN KEY, con la sintassi "ALTER TABLE tabella DROP FOREIGN KEY nome".

Qualora il nome non venga indicato, sarà creato in automatico dal server e visualizzabile attraverso "SHOW CREATE TABLE tabella".

Nell'esempio abbiamo visto l'indicazione della clausola ON DELETE per gestire le cancellazioni sulla chiave esterna referenziata; allo stesso modo è possibile utilizzare ON UPDATE per gestire gli aggiornamenti. Entrambe le opzioni accettano come valori possibili uno dei seguenti: CASCADE, SET NULL, RESTRICT, NO ACTION.

Con il primo, come abbiamo visto, le modifiche sulla tabella madre vengono riportate sulla tabella figlia. Con SET NULL gli eventuali valori presenti nella tabella figlia vengono impostati a NULL (la definizione della colonna lo deve consentire). Le ultime due equivalgono a non indicare la clausola e comportano il rifiuto della modifica sulla tabella madre.

In una tabella InnoDB non è possibile utilizzare indici FULLTEXT, e le colonne di tipo geometrico sono disponibili solo a partire dalla versione 5.0.16. Per le colonne AUTO_INCREMENT deve esistere un indice di cui siano l'unico componente.

- 9 -

Page 10: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Amministrazione di MySQL

(http://database.html.it/guide/lezione/2439/amministrazione-di-mysql-ii/)

Analizziamo ora alcune opzioni disponibili per mysqld, cioè per il vero e proprio server MySQL; ricordiamo che possiamo specificarle sia sul file di configurazione che sulla riga di comando, oltre a passarle allo script di avvio che le ritrasmette integralmente al server. Fra parentesi indichiamo la versione breve dell'opzione, che può essere utilizzata da riga di comando:

--basedir=percorso (-b percorso) --datadir=percorso (-h percorso) --port=porta (-P porta) --socket=percorso --user=username o userid (-u username o userid) --default-table-type=tipo --default-time-zone=time-zone --language=linguaggio (-L linguaggio) --old-passwords --skip-bdb --skip-innodb --sql-mode=valore[,valore[,valore...]] --transaction-isolation=livello

File di opzioni ( o di configurazione). I file di opzioni ci consentono di specificare valori che devono essere letti dai programmi tutte le volte che vengono avviati. I programmi vengono cercati, salvo diverse indicazioni, nelle seguenti posizioni:

C:\salva\MySQL\MySQL Server 5.0\my.ini (dove C:\salva\ è la directory il cui è stato, in questo esempio, installato MySQL)

- 10 -

Page 11: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Vediamo ora qualche spiegazione su queste opzioni:

Opzione Descrizione --basedir directory di installazione di MySQL

--datadir directory contenente i dati

--port porta su cui il server sta in ascolto

--socket per le connessioni locali; su Unix è il socket file (default /tmp/mysql.sock), su Windows indica il pipe name usato (default MySQL)

--user nome utente di sistema col quale gira il server; è obbligatorio indicarlo quando il server viene lanciato dall'utente root, in quanto MySQL "si rifiuta" di essere eseguito come root

--default-table-type tipo di tabelle di default

--default-time-zone timezone del server. Se non indicata viene adottata quella del sistema su cui il server è in esecuzione.

--language utile per impostare il linguaggio dei messaggi di errore al client. Le lingue disponibili sono quelle installate nella directory share/ di installazione

--old-passwords importante quando si deve consentire la connessione a client precedenti la versione 4.1 (ad esempio le librerie MySQL di PHP 4).

--skip-bdb disabilita le tabelle di tipo BDB

--skip-innodb disabilita le tabelle di tipo InnoDB

--sql-mode consente di "regolare" il comportamento del server rispetto al linguaggio SQL

--transaction-isolation

default del livello di isolamento delle transazioni. I valori possibili sono READ-UNCOMMITTED, READ-COMMITTED, REPETEABLE-READ, SERIALIZABLE.

L'opzione sql-mode prevede diverse modalità sql fra le quali è molto importante lo strict mode, che decide in che modo il server gestisce i valori in input non validi (tipo dato errato o dato fuori range) o mancanti (quando manca un default esplicito). Gli strict mode possibili sono STRICT_TRANS_TABLES e STRICT_ALL_TABLES.

Se uno dei due è abilitato, le tabelle transazionali generano un errore in questi casi, e viene eseguito il roll back dell'istruzione, per cui nessun update risulta effettuato sui dati. Le tabelle non transazionali si comportano allo stesso modo quando l'update avrebbe interessato una sola riga, oppure quando sono interessate più righe ma l'errore avviene sulla prima.

Se invece l'errore avviene su una riga successiva alla prima, nel caso in cui sia attivo STRICT_ALL_TABLES le tabelle non transazionali generano l'errore e interrompono l'elaborazione: da questo deriva una situazione di update eseguito in modo parziale. Se invece è attivo solo STRICT_TRANS_TABLES viene generato solo un warning e l'operazione prosegue, convertendo i valori invalidi al più vicino valore valido e utilizzando i default impliciti al posto dei valori mancanti. Questo è anche il comportamento del server quando nessuno strict mode è attivo.

Vediamo ora alcuni altri valori possibili per sql-mode:

- 11 -

Page 12: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

ALLOW_INVALID_DATES - accetta date non valide NO_ZERO_DATE - esclude le date '0000-00-00' in strict_mode NO_ZERO_IN_DATE - esclude le date con valori 0 nel mese o nel giorno in strict_mode NO_AUTO_CREATE_USER - evita che una GRANT crei un utente senza password REAL_AS_FLOAT - considera le colonne REAL come FLOAT e non come DOUBLE

Esistono poi dei valori "cumulativi" che corrispondono ad insiemi delle impostazioni viste fin qui e di altre non citate. Tali valori tendono a replicare il comportamento di altri RDBMS:

ANSI DB2 MAXDB MSSQL MYSQL323 MYSQL40 ORACLE POSTGRESQL TRADITIONAL

Per vedere la lista completa dei valori è possibile consultare il manuale (http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html )

Le variabili del server. Lanciando il server MySQL è possibile anche impostare il valore delle variabili di sistema, che infuiscono sulla configurazione del server. La maggior parte di queste possono essere modificate anche a runtime con l'istruzione SET (è necessario il privilegio SUPER).

Le variabili sono di due tipi: globali e di sessione.

Le variabili globali riguardano il server nel suo complesso e, quando sono dinamiche, possono essere variate con l'istruzione SET GLOBAL nome_variabile.

Le variabili di sessione invece sono relative ad una singola connessione e vengono impostate al momento dell'apertura con i valori globali del momento; successivamente possono essere modificate (se dinamiche) con SET SESSION nome_variabile. Eventuali modifiche ai valori globali non influiscono sulle sessioni già aperte.

In fase di avvio del server è possibile impostare il valore massimo che può essere assegnato dinamicamente ad una variabile con un'opzione di questo tipo:

--maximum-nome_variabile=valore

- 12 -

Page 13: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Fra le variabili del server segnaliamo max_allowed_packet, che stabilisce la dimensione massima dei caratteri che possono essere inviati al server con una singola istruzione. È importante quindi dimensionarla adeguatamente quando si ha bisogno di caricare file piuttosto grossi.

Un'altra variabile rilevante è query_cache_size, che consente di abilitare l'utilizzo del caching delle query. Questo sistema consente di ottenere notevoli miglioramenti nella velocità di risposta delle query, soprattutto quando i dati vengono modificati raramente rispetto alla mole di accessi in lettura che ricevono. Il sistema di caching garantisce comunque di non restituire mai dati obsoleti. Per abilitarlo bisogna impostare la variabile ad un minimo di 40960 bytes. Quando il suo valore è 0 il caching non viene utilizzato.

Segnaliamo infine anche la variabile language, che ci permette di stabilire la lingua in cui vengono restituiti gli errori da parte del server. Deve essere impostata con il percorso della directory che contiene i messaggi nella lingua che ci interessa: si trova nella sottocartella share della directory di installazione di MySQL. Fra le numerose lingue disponibili c'è anche l'italiano.

- 13 -

Page 14: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Configurazione di MySQL tramite my.ini

Prima di effettuare qualsiasi variazione sul file my.ini è necessario fermare il

server MySQL e riavviarlo dopo le variazioni effettuate.

Aprire con un editor il file my.ini (prima di modificare il file my.ini è consigliabile farne una copia) :

- 14 -

Page 15: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Impostare la directory contenente i dati

La directory di default, in Windows, per contenere i dati è la sottodirectory data della directory di installazione. In fase di installazione di MySQL viene creata la sottodirectory data contenente le seguenti sottocartelle :

Se si vuole modificare questa impostazione di default per memorizzare i dati in un’altra directory, per esempio c:/Dati , si deve creare manualmente la nuova directory (il server MySQL non la crea se non esiste)

e copiare la sottodirectory mysql .

- 15 -

Page 16: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

aprire il file my.ini

modificare la riga selezionata impostando il nuovo percorso per i dati

Al primo avvio del server MySQL vengono generati i seguenti file :

- 16 -

Page 17: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Per ottenere lo stesso risultato invece di intervenire sul file my.ini si può utilizzare MySQL Administrator in modalità configure-service mode (vedere : Installazione e configurazione di MySQL 5.0.) dopo aver creato manualmente la nuova directory e aver copiato la sottodirectory mysql come visto precedentemente.

stoppare il server e selezionare la voce

- 17 -

Page 18: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

- 18 -

in corrispondenza della voce inserire percorso della nuova directory che deve contenere i dati

confermare cliccando su e riavviare il server. La variazione, ovviamente, è riportata sul file my.ini :

Page 19: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Impostare il linguaggio dei messaggi di errore al client

• --language: utile per impostare il linguaggio dei messaggi di errore al client. Le lingue disponibili sono quelle installate nella directory share/ di installazione

Aprire my.ini ed aggiungere la riga evidenziata

- 19 -

Page 20: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Impostare il default storage engine (tipo di tabella)

Aprire my.ini e correggere la riga evidenziata inserendo MyISAM o InnoDB per impostare il tipo di tabella di default ogni volta che si usa l’istruzione CREATE TABLE. Se si crea una tabella con MySQL Query Browser, invece, viene comunque utilizzato l’engine InnoDB :

Creazione della tabella con l’istruzione CREATE TABLE

- 20 -

Page 21: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

- 21 -

selezionare la tabella, cliccare con il tasto destro del mouse e, quindi, selezionare dal menu popup la voce Edit Table :

si può, in questo modo, verificare l’avvenuta creazione della tabella :

Page 22: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

- 22 -

selezionare il tab per verificare il tipo di engine utilizzato nella crerazione della tabella :

Page 23: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Nella cartella, in questo esempio C:\salva\MySQL\MySQL Server 5.0\data,

riservata a contenere i databases, si può aprire la sottocartella relativa al database in cui è stata creata la tabella

per verificare i tre file con estensione .frm, .MYD e .MYI generati in corrispondenza alla tabella creata :

- 23 -

Page 24: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Creazione della tabella con MySQL Query Browser

selezionare il database in cui si vuole creare la tabella, cliccare con il tasto destro del mouse e, quindi, selezionare dal menu popup la voce Create New Table :

inserire il nome della tabella :

- 24 -

Page 25: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

e, successivamente, cliccare due volte in corrispondenza di . Inserire

il nome del campo e spostarsi sulla colonna :

In questo modo è stato creato il campo corrispondente alla chiave primaria ed, ovviamente, si può continuare ad inserire tutti gli altri campi della tabella (in questo esempio si crea solo un campo).

Alla fine cliccare su .

- 25 -

Page 26: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Compare la seguente finestra in cui viene visualizzata l’ istruzione per la creazione della tabella (notare che l’engine proposto è InnoDB !) :

Cliccare su per procedere alla creazione della tabella. L’engine utilizzato, come si può verificare, è InnoDB :

- 26 -

Page 27: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

per la tabella creata viene, nella sottodirectory corrispondente al database, generato

un solo file con estensione .frm

Come già detto con le tabelle INNODB i dati di TUTTI i database presenti sul server e che utilizzano tabelle INNODB vengono normalmente salvati nel file ibdata1.

- 27 -

Page 28: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

Variazione dell’ engine di una tabella

da InnoDB a MyISAM

Dopo aver aperto la tabella, per cambiare l’engine, selezionare la voce

- 28 -

Page 29: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

selezionare MyISAM

e confermare con

cliccare su per completare la variazione.

- 29 -

Page 30: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

per controllare l’avvenuta variazione è sufficiente verificare i file (con estensione .frm, .MYD e .MYI) presenti nella cartella del database contenente la tabella

- 30 -

Page 31: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

da MyISAM a InnoDB

i passi da effettuare sono simili a quelli visti nel paragrafo precedente :

- 31 -

Page 32: Differenza tra le tabelle di tipo MyISAM e InnoDBfrancy59.altervista.org/.../tabelle_configurazione_MySQL.pdf · Configurazione di MySQL 5.0. Tipi di tabelle MySQL . - 2 - In questo

Configurazione di MySQL 5.0. Tipi di tabelle MySQL .

per controllare l’avvenuta variazione è sufficiente verificare il file (con estensione .frm) presente nella cartella del database contenente la tabella

- 32 -