MySQL-Tabellentypen: Ein Vergleich
MySQL bietet verschiedene Tabellentypen bzw. -formate. Als Standard wird MyISAM verwendet, aber daneben gibt es auch InnoDB, BDB, MemoryDB und andere. Dieser Artikel soll die Eigenschaften der verschiedenen Systeme vorstellen und sie miteinander vergleichen.
Grundlegend wird in transaktionsbasierte (z.B. InnoDB, BDB, Gemini) und nicht-transaktionsbasierte Formate (z.B. MyISAM, ISAM, HEAP, MERGE) unterschieden. Transaktionen sind untrennbare Blöcke.
Ein gern genommenes Beispiel ist die Überweisung bei einer Bank:
UPDATE konten SET saldo=saldo-100 WHERE ktonr=1234; UPDATE banken SET saldo=saldo-100 WHERE filialnr=(SELECT filialnr FROM konten WHERE ktonr=1234); UPDATE konten SET saldo=saldo+100 WHERE ktonr=4322; UPDATE banken SET saldo=saldo+100 WHERE filialnr=(SELECT filialnr FROM konten WHERE ktonr=4322);
Es sollten entweder alle Befehle ausgeführt werden oder gar keiner (nicht auszudenken, was passieren würde, wenn der Server nach dem ersten oder zweiten Befehl einen Fehler bekommt – dann ist das Geld im Nirwana verschwunden). Deshalb umschließt man diesen Block mit BEGIN
und COMMIT;
. Dann wird der DB-Zustand nur gespeichert, wenn das COMMIT erreicht wird – also alle Befehle ausgeführt wurden.
Nun aber zu den einzelnen Formaten:
MyISAM (stellvertetend für nicht-transaktionsorientierte Tabellentypen)
- gute Kompatibilität aufgrund der Little-Endian-Architektur. Das bedeutet, dass alle Daten mit dem niederwertigsten Bit zuerst gespeicheichert werden. Dadurch sind die Daten MyISAM maschinen- und betriebssystemunabhängig.
- eine MyISAM-Tabelle kann maximal 64 Indizes haben, was sich aber durch Rekompilieren ändern lässt: Ab Version MySQL 5.1.4 kann configure mit der Option –with-max-indexes=N aufgerufen werden, wobei N die Höchstzahl der pro MyISAM-Tabelle zulässigen Indizes ist. N muss kleiner oder gleich 128 sein.
- Pro Index sind maximal 16 Spalten möglich
- Intern wird eine AUTO_INCREMENT-Spalte pro Tabelle unterstützt. Diese Spalte wird bei INSERT- und UPDATE-Operationen automatisch eingefügt. Das macht AUTO_INCREMENT-Spalten schneller (um mindestens 10%) als wenn man das Verwalten der IDs selbst übernimmt.
- NULL-Werte in indizierten Spalten sind zulässig. Hierfür werden 0 bis 1 Byte pro Schlüssel gebraucht.
InnoDB (stellvertetend für transaktionsorientierte Tabellentypen)
- transaktionssicher (inklusive Rollback-, Commit- und Datenwiederherstellungsfähigkeit)
- Zeilensperren möglich (statt Tabellensperren bei MyISAM), konsistentes Auslesen (SELECT) ohne Sperren möglich -> Beschleunigung paralleler Abfragen
- Unterstützung von Fremdschlüsseln
- sehr effiziente Ausnutzung der CPU
Memory-Engine (Heap-Tabellen)
Diese Tabellen existieren vollständig im RAM. Das ist gleichzeitig Fluch und Segen:
- sehr schneller Zugriff
- nach Absturz nicht wiederherstellbar
Das sind die wichtigsten Unterschiede. Natürlich gibt es auch noch andere Tabellentypen, aber in der Praxis kommen eigentlich nur diese drei zum Einsatz (was MySQL angeht).
Fazit:
InnoDB, Gemini und BDB sollten dann eingesetzt werden, wenn die Konsistenz der Datenbank auf keinen Fall gefährdet werden darf. Die Daten können nach einem Absturz von MySQL automatisch wiederhergestellt werden. Zugleich stellen Transaktionen sicher, dass nicht mehrere Anwender simultan Datensätze verändern, und sichern damit die Integrität der Datenbank.
Verknüpfte Tabellen verweisen nur auf tatsächlich existierende Datensätze und nicht ins Leere. Transaktions-sichere Tabellen sind aber langsamer als das am häufigsten verwendete MyISAM-Format.
Noch schneller als diese sind Heap Tables, die vollständig im Speicher residieren, aber nach einem Absturz oder Reboot natürlich verschwunden sind und sich deshalb nur für eine temporäre Datenhaltung eigen.