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 technologieë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.

MyISAM tabellen converteren naar InnoDB

Je converteert MyISAM eenvoudig met een ALTER TABLE opdracht, zoals ik heb uitgelegd in mijn Engelstalige Saotn.org artikel 'convert MySQL MyISAM tabels to InnoDB':

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 SQL prepared statement (query) om de ALTER TABLE regels voor alle tabellen te printen. Hoef je het alleen nog maar te kopiëren en plakken.


Vond je deze post een kleine donatie waard?

Dank je wel!