# MyISAM

MyISAM è stato lo storage engine predefinito in MySQL dalla sua introduzione (versione 3.23) fino alla versione 5.5. La licenza è la GNU GPL versione 2. MyISAM utilizza la struttura ISAM e deriva da un tipo più vecchio, oggi non più utilizzato, che si chiamava appunto ISAM. È un motore di immagazzinamento dei dati estremamente veloce e richiede poche risorse, sia in termini di memoria RAM, sia in termini di spazio su disco. Il suo limite principale rispetto ad alcuni altri SE, come InnoDB, consiste nel mancato supporto delle transazioni.
L'autore di MyISAM e del vecchio ISAM è Michael Widenius, ideatore di MySQL. Quando ha lasciato MySQL, e prima di fondare MariaDB, ha iniziato a dedicarsi allo sviluppo di Aria, un'evoluzione transazionale di MyISAM. In MySQL e nei suoi fork, lo storage engine predefinito è ormai InnoDB e non più MyISAM. Non è più distribuito con Drizzle (ma dovrebbe essere possibile utilizzarlo).

## Struttura dei file

Ogni tabella di tipo MyISAM è registrata in tre file differenti. Ognuno ha un nome costituito da due parti: il nome di base è uguale al nome della tabella, mentre l'estensione indica la funzione del file. Ad esempio, una tabella "mia_tabella" sarà composta da tre file chiamati:
* mia_tabella.frm
* mia_tabella.myi
* mia_tabella.myd
Il file .frm rappresenta la struttura della tabella: dimensioni e tipo di ogni colonna, indici, ecc. Il file .MYI (MYIndex) contiene gli indici. Il file .MYD (MYData) contiene i dati veri e propri.

### Spazio richiesto dagli indici

Gli indici di una tabella MyISAM possono essere compressi; per fare ciò, impostare la proprietà PACKED_KEYS=1. Questo aiuta soprattutto quando si hanno diversi indici numerici interi che hanno un uguale prefisso.
Gli indici stringa sono sempre compressi. La loro compressione aiuta soprattutto se vi sono molte stringhe con un uguale prefisso.
Gli indici di MyISAM normalmente sono di tipo B-Tree. Per calcolare lo spazio massimo richiesto dagli indici B-Tree non compressi, si può utilizzare la seguente formula:

### Formati dei dati

MyISAM può registrare i dati in tre differenti formati:
* fixed;
* dynamic;
* compressed.
I primi due vengono scelti automaticamente da MySQL a seconda dei tipi di colonne utilizzati. Per creare una tabella compressed, invece, occorre utilizzare il programma myisampack.

#### Fixed

Questo è il formato di default. Viene utilizzato se non vi sono colonne a lunghezza variabile (tipi VARCHAR, BLOB, o TEXT). In questo caso ogni record viene registrato utilizzando un numero fisso di byte.
Questo è il formato più semplice ed è anche il più veloce e il più sicuro. La deframmentazione di una tabella con formato fisso è necessaria solo se si desidera recuperare spazio su disco dopo aver eliminato un numero di record molto elevato.

#### Dynamic

Questo formato viene utilizzato se nella tabella sono presenti colonne a lunghezza variabile o se la tabella viene creata con l'opzione ROW_FORMAT=DYNAMIC.
Questo formato è più complesso rispetto a Fixed. Ciò è dovuto al fatto che ogni record può avere dimensioni diverse; un record potrebbe addirittura essere diviso fisicamente in più parti, se le sue dimensioni aumentano in seguito a un UPDATE. Per limitare questo problema, è possibile deframmentare la tabella con il comando OPTIMIZE TABLE.
Ogni record è delimitato da una sequenza di bit corrispondenti a una stringa vuota. I valori di 4 byte o meno non hanno mai dimensioni variabili.
Il vantaggio del formato Dynamic consiste nell'occupare molto meno spazio di una tabella in formato Fixed. Per calcolare approssimativamente lo spazio richiesto da un singolo record dinamico, si può utilizzare la seguente formula:
Occorre poi aggiungere 6 byte per ogni collegamento. Un collegamento si crea quando un UPDATE aumenta le dimensioni di un record, che quindi deve dividersi in più locazioni sul disco. Ogni nuova locazione misura almeno 20 byte, quindi potrebbe contenere l'espansione di più record.

#### Compressed

Una tabella compressa può essere creata solo con la utility myisampack. La tabella potrà poi essere decompressa solo con la utility myisamchk. Entrambi i programmi vengono distribuiti con tutte le edizioni di MySQL.
Le tabelle Compressed sono a sola lettura. I dati occupano molto poco spazio. Questo aiuta nel caso di dischi molto lenti, come per esempio CD-ROM. Può contenere sia dati a lunghezza fissa, sia a lunghezza variabile.

## Come creare una tabella di tipo MyISAM

La sintassi per creare una tabella MyISAM è la seguente:
Per convertire una tabella già esistente in MyISAM:
È consigliato utilizzare la parola ENGINE poiché TYPE (utilizzato nelle vecchie versioni di MySQL) è in disuso.
MyISAM è uno dei motori sempre presenti (insieme a MEMORY e Merge) ed è il tipo di tabella predefinito al momento in cui MySQL viene installato. Essendo predefinito, si può evitare di utilizzare la clausola ENGINE. Siccome però il tipo predefinito può mutare, per esserne certi si può eseguire:

## MyISAM nei fork di MySQL

Drizzle non include MyISAM.
MariaDB ha implementato la segmentazione della cache degli indici. Lo scopo di questa funzionalità è ridurre il numero di mutex, cioè di lock sulla cache degli indici che costringono i thread a rimanere in attesa. La versione originale della patch è di Fredrik Nylander di Stardoll.com. In seguito, Monty Program ha ottimizzato il codice. È stata anche aggiunta una tabella, nel database information_schema, contenente informazioni sui segmenti della cache.
Percona Cluster non supporta le tabelle MyISAM.