Ciao a tutti,
affrontiamo di seguito un confronto tra le tabelle MyISAM (le classiche di MySQL) e le innovative INNODB (relativamente).
Cerchiamo innanzitutto di schematizzarne le differenze:
MyISAM (Default engine di MySQL)
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:
* frm
Struttura della tabella
* MYD
File contenente tutti i dati della tabella
* MYI
File contenente i dati relativi agli indici del database
Inutile sostituirsi ai manuali… :-D
Per maggiori informazioni: http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html
INNODB
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, come sempre per maggiori informazioni vi rimando al manuale ufficiale di MySQL: http://dev.mysql.com/doc/refman/5.0/en/innodb-overview.html
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 (N.D.R. 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!
Sperando di essere stato il più chiaro possibile vi saluto.
Ciao. Max
info[AT]massimo-caselli[DOT]com
Breve overview sulle caratteristiche e funzionalità del database server MySQL
Velocità accesso alle tabelle
Per quanto mi riguarda (diretta esperienza) posso dire che le tabelle MyIsam sono di gran lunga più veloci di quelle InnoDB soprattutto in ambiente Linux piuttosto che winzozz (lento da far schifo circa 20 volte più lento e non scherzo!!!).