InnoDB oder MyISAM
Haben Sie sich schon einmal gefragt, was es mit den unterschiedlichen sog. MySQL-Storage-Engines auf sich hat und wo eigentlich der Unterschied besteht? Bei diesem Thema trifft man unweigerlich auf die beiden gängigsten Typen: InnoDB und MyISAM
Die Frage selbst, welcher der beiden Typen nun der Bessere ist, tritt immer wieder auf und man findet so viele Befürworter wie wenn man die Frage stellen würde: Apple- oder Microsoft-Produkte?
Die Unterschiede
Wir beschränken uns auf die harten Fakten, die eine Übersicht der beiden Formate geben wird.
MyISAM
Es wird bei einem Zugriff immer die ganze Tabelle gesperrt
INSERT und UPDATE sind dadurch langsamer
SELECT wird schneller ausgeführt
Integrierte Volltextsuche
viele Jahre Standard-Engine bei MySQL
InnoDB
Zugriff sperrt nur den Datensatz (Row) anstelle der Tabelle
INSERT und UPDATE werden schneller ausgeführt als bei MyISAM
Unterstützt Fremdschlüssel
Nach einem Absturz der Datenbank Möglichkeit der Wiederherstellung
Höherer Bedarf an Arbeits- und Festplattenspeicher
SELECT ist dafür langsamer
Insgesamt etwas langsamere Verarbeitung von SQL-Statements
Es gibt keine Volltextsuche (künftig geplant)
Seit MySQL 5.5.6 Standard-Engine bei MySQL
Sieht man sich moderne CMS, Blogs, Shops oder Wikis an, so stellt man fest, dass mittlerweile nahezu alle ausschließlich InnoDB für alle Ihre Tabellen einsetzen. Viele Erweiterungen und Plugins nutzen jedoch auch MyISAM.
InnoDB eignet sich bei großen Datenbanken in denen viele Daten miteinander verknüpft sind. Wenn hier Daten gelöscht werden, löscht InnoDB alle referenzierten Daten automatisch mit. Das macht es der Anwendung hinter der Datenbank leichter die referentielle Integrität einzuhalten (z.B. Mediawiki, Magento).
Mischbetrieb und JOINs
Hat man viele Lesezugriffe auf die Tabellen und große Datensätze, ist MyISAM sicherlich die bessere Wahl. Dies ist auch der Grund, warum so viele Erweiterungen zu aktuellen Systemen auch auf MyISAM setzen, denn im Regelfall werden nur zusätzliche Informationen bereitgestellt und mit dem jeweiligen Plugin ausgelesen. Wenn dann seltener einmal auch eine Änderung/Speicherung erfolgt, ist dies zu vernachlässigen.
Dieser Mischbetrieb allerdings ist schlecht, spätestens wenn ein JOIN (Erklärung bei selfhtml.org) verwendet wird und eine der damit verknüpften Tabellen vom Typ MyISAM ist. Denn jede Abfrage mit einem JOIN auf eine MyISAM-Tabelle verursacht einen Table-Lock, was bei vielen Datenbank-Queries die Reaktionszeit deutlich beeinträchtigt.
Ist man sich sicher, dass keine bis sehr wenige JOINs im Einsatz sind und die klare Trennung der Funktionen findet eben aus dem Grund statt, für den jeweiligen Anwendungszweck die passendste Storage Engine zu verwenden, ist ein Mischbetrieb problemlos möglich. Beispielsweise MyISAM für eine Tabelle mit Volltextsuche, InnoDB für Tabellen mit Sessions oder Einstellungen eines Benutzers.
Tabelle umwandeln
Soll eine bestehende Tabelle einer Datenbank in MyISAM umgewandelt werden, so lautet der Befehl im phpMyAdmin dafür:
ALTER TABLE tablename ENGINE=myisam;
Tabelle einer Datenbank in InnoDB umwandeln:
ALTER TABLE tablename ENGINE=innodb;
Vorher sollte jedoch unbedingt ein Backup der Datenbank erstellt werden!
Fazit
InnoDB ist grundsätzlich neuer, wenn auch komplexer und benötigt im Vergleich zu MyISAM eine deutlich performantere Datenbank-Umgebung. Allerdings werden auch die Web-Anwendungen immer komplexer und benötigen die Möglichkeiten, die InnoDB ihnen bietet (Spätestens wenn Fremdschlüssel und/oder Transaktionen benötigt werden).
Egal wofür man sich letztlich entscheidet, sollte von einem Mischbetrieb beider Storage-Engines – wie erwähnt – im besten Fall abgesehen werden.
Haben Sie sich schon einmal über die MySQL-Storage-Engines Gedanken gemacht und bevorzugen Sie eine der Erwähnten?
Vielen Dank für den umfassenden Artikel.