April 15, 2019

Het einde van MyISAM als MySQL opslagformaat

MyISAM als tabelopslagformaat in MySQL is hopeloos verouderd. Vernieuwingen en prestatieverbeteringen zijn er voor het InnoDB opslagformaat, en dat is wat je dus moet gebruiken. Vooral als je óók snelheid & performance belangrijk vindt!

Dit verhaal met MyISAM lijkt wel een beetje op Microsoft Office Access: het wil gewoon niet dood^Wweg! :-( Maar nu vraag je je vast af waar deze post precies over gaat, en wat MyISAM is. Lees dan gauw verder!


MyISAM is een tabel storage engine in MariaDB- en MySQL-databaseserversoftware (leuk Scrabblewoord). Een storage engine, of het opslagformaat, bepaalt in welke structuur de data in een tabel opgeslagen wordt. Zo is ook InnoDB een opslagformaat. En InnoDB is een nieuwer opslagformaat.

Nieuwer is beter, ik leg je graag uit waarom.

Advertentie:


Het MyISAM opslagformaat is dusdanig verouderd, dat het niet meer doorontwikkeld wordt door MariaDB of MySQL. Alle vernieuwingen en prestatieverbeteringen zijn voor het InnoDB-formaat. Alleen al hierom wil je graag InnoDB gebruiken, toch?! Maar er is een tweede reden:

Tegenwoordig werken veel databaseservers in een cluster. Dit garandeert high-availability (hoge beschikbaarheid) en high-performance (hoge prestaties) van jouw databases.

Echter, MyISAM kan niet gebruikt worden in zo'n high-availability, high-performance databasecluster. Dus als jouw database nog MyISAM tabellen gebruikt, dan profiteer je niet van de voordelen van zo'n cluster. En het gebruiken van nieuwere technolgieën, zoals een opslagformaat, is belangrijk voor het optimaliseren van jouw MySQL database.

Hoe herken ik MyISAM tabellen?

Advertentie:


In veel online voorbeeldcode vind je nog CREATE TABLE voorbeelden zoals:

CREATE TABLE `gastenboek` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`user` VARCHAR(255) NOT NULL,
	`mail` VARCHAR(255) NOT NULL,
	`post` TEXT NOT NULL,
	`url` VARCHAR(255) NOT NULL,
	`date` VARCHAR(32) NOT NULL,
	FULLTEXT(post),
	PRIMARY KEY(id)
) ENGINE = MyISAM;

CREATE TABLE gastenboek_blacklist (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`listedIP` VARCHAR(15) NOT NULL,
	`date` VARCHAR(32) NOT NULL,
	PRIMARY KEY(id),
	INDEX(listedIP)
) ENGINE = MyISAM;

-- voeg een record toe in het gastenboek
insert into `gastenboek` (id, user, mail, post, url, date) values (default, 'Jan Reilink', 'jan@reilink.nl', 'Dit is het eerste bericht in dit oude gastenboek.<br>I hope you\'ll like it!', 'https://www.reilink.nl', NOW());

-- voeg een record toe in de blacklist
insert into `gastenboek_blacklist` (id, listedIP, date) values (default, '203.0.113.25', NOW());

Log je nu in op jouw MySQL-database via phpMyAdmin, dan ziet dat er als volgt uit:

phpMyAdmin met MyISAM tabellen

Onder de kolom Type zie je MyISAM staan. En dat is precies wat je wilt converteren: MyISAM naar InnoDB.

Je zet MyISAM eenvoudig om met een ALTER TABLE opdracht, zoals ik heb uitgelegd in mijn Engelstalige Saotn.org artikel 'convert MySQL MyISAM tabels to InnoDB' (en bij Vevida):

ALTER TABLE `gastenboek` ENGINE=InnoDB;
ALTER TABLE `gastenboek_blacklist` ENGINE=InnoDB;
phpMyAdmin ALTER TABEL naar InnoDB

Hier zeg je eigenlijk tegen MariaDB / MySQL: pas mijn tabel gastenboek aan en zet de ENGINE op InnoDB. Doe dit ook voor de tabel gastenboek_blacklist.

Advertentie:


In phpMyAdmin ziet het er dan als volgt uit (let op de kolom Type):

phpMyAdmin met InnoDB tabellen

Nu is dit met twee, drie of tien tabellen nog wel handmatig te doen. Maar bij enkele tien- of honderdtallen tabellen kun je dit beter automatiseren. Zie het hierboven gelinkte artikel voor een query om de ALTER TABLE regels voor alle tabellen te printen. Hoef je het alleen nog maar te kopiëren en plakken.

Doneer een kop koffie via Paypal. Dank je!