MyISAM è uno dei motori di archiviazione più popolari in MySQL. MyISAM è spesso la seconda scelta dopo InnoDB:in questo post del blog cercheremo di scoprire come lavorare al meglio con questo motore.
Cos'è MyISAM?
MyISAM è uno dei motori di archiviazione di MySQL. MyISAM si basa su ISAM (Indexed Sequential Access Method), un algoritmo di indicizzazione sviluppato da IBM che consente di recuperare informazioni da grandi insiemi di dati in modo rapido. Tuttavia, non funziona molto bene quando si legge e si scrive contemporaneamente su una tabella, a causa del blocco della tabella. Inoltre non supporta le transazioni.
Per alcuni ingegneri MySQL, questo motore è la scelta più popolare dopo InnoDB:il motore di archiviazione MyISAM è stato l'unico motore di archiviazione fornito da MySQL nel 2005 ed è stato disponibile per l'uso per più di 20 anni. MyISAM era il motore di archiviazione predefinito per MySQL fino alla versione 5.5.
MyISAM dall'interno
Un'illustrazione di come funziona MyISAM dall'interno non rientra nello scopo di questo blog, ma possiamo fornirti le impostazioni che ti aiutano a ottimizzare le prestazioni del motore:
- Myisam_sort_buffer_size definisce il buffer che viene allocato quando l'indice viene ordinato eseguendo query REPAIR, CREATE INDEX o ALTER TABLE.
- Key_buffer_size definisce la dimensione del buffer utilizzato per i blocchi di indice nelle tabelle MyISAM. L'aumento di questo parametro può portare a una migliore gestione dell'indice.
- Sort_buffer_size descrive la dimensione di un buffer allocato per i thread che devono eseguire operazioni di ordinamento.
- Read_buffer_size descrive la dimensione di un buffer allocato per i thread che eseguono operazioni di scansione sequenziale.
- Write_buffer_size descrive la dimensione del buffer di scrittura.
Questi quattro parametri sono importanti, ma sebbene siano importanti, dovresti anche tenere d'occhio la variabile key_buffer_size. La variabile key_buffer_size determina la dimensione dei buffer di indice tenuti in memoria:pensala come la controparte innodb_buffer_pool_size, ma per MyISAM. Se i tuoi server sono costituiti principalmente da tabelle MyISAM, puoi allocare circa il 25% o più della RAM disponibile sul server alla variabile key_buffer_size. C'è anche un altro modo per determinare quale dovrebbe essere il valore del parametro key_buffer_size:confrontare semplicemente il valore key_read_requests (valore totale delle richieste per leggere un indice) e il valore key_reads (il valore di key_reads è il numero di richieste che dovevano essere leggere da disco). I valori per quei parametri possono essere recuperati guardando le variabili di stato del server (semplicemente emettere una query SHOW GLOBAL STATUS sul tuo server MySQL). È anche utile tenere a mente che se key_reads restituisce un valore grande, il valore di key_buffer_size è probabilmente troppo piccolo.
MyISAM e MySQL 8.0
Se chiedi ad alcuni ingegneri MySQL, diranno che MyISAM non dovrebbe più essere utilizzato. Come mai? Ebbene, alcune persone lo dicono a causa del fatto che quando MySQL è avanzato, hanno aggiunto la maggior parte delle funzionalità che in precedenza potevano essere viste solo in MyISAM in InnoDB, rendendo MyISAM effettivamente obsoleto:
- Gli indici full-text sono disponibili in InnoDB dalla versione 5.6.
- I tablespace portatili sono diventati disponibili in InnoDB dalla versione 5.6.
- Gli indici spaziali sono diventati disponibili in InnoDB dalla versione 5.7.
- L'ultimo aggiornamento per la tabella è diventato disponibile in InnoDB dalla versione 5.7.
Quindi, dovresti ancora usare MyISAM? Probabilmente no. C'è però un avvertimento:tieni presente che le semplici query COUNT(*) probabilmente funzioneranno più velocemente su MyISAM rispetto a InnoDB:MyISAM memorizza il numero nei metadati della tabella, InnoDB no.
Sto usando MyISAM e voglio passare a InnoDB, cosa devo fare?
Se usi ancora MyISAM e vuoi passare a InnoDB, converti semplicemente tutte le tue tabelle in InnoDB. Ovviamente è più facile a dirsi che a farsi, ma ecco una semplice guida:
- Scopri quali tabelle nella tua istanza MySQL stanno usando MyISAM:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- Converti tutte le tue tabelle MyISAM in InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
Se non si desidera eseguire più istruzioni ALTER TABLE una dopo l'altra, considerare di inserire le istruzioni ALTER TABLE in un ciclo. Ecco fatto:il gioco è fatto!
Riepilogo
MyISAM è uno dei motori MySQL più popolari. Il motore era l'impostazione predefinita per le versioni di MySQL fino alla 5.5. Il motore è una delle scelte più popolari dopo InnoDB, ma può essere definito obsoleto a partire da MySQL 8.0 - MySQL si è già assicurato che tutto ciò che può essere fatto con MyISAM possa essere fatto anche quando InnoDB è in uso, quindi a questo punto MyISAM è praticamente utile solo se vuoi che le query COUNT(*) semplici siano più veloci. Tali query saranno più veloci perché MyISAM memorizza il numero nei metadati della tabella, altri motori MySQL no.