Advanced MySQL - Speicherengines
1. Der feine Unterschied
MySQL bietet derzeit 10 verschiedene "Storage engines" an. Und jede von denen wurde für einen ganz bestimmten Zweck optimiert. Meiner Meinung nach sind davon eigentlich nur drei wirklich interessant, ich stelle euch trotzdem mal alle vor.
ARCHIVE
BDB
BLACKHOLE
CSV
EXAMPLE
FEDERATED
InnoDB
MEMORY
Merge
MyISAM
2. Und nun?
Na ja, für BDB
wurde der Support ab 5.1 eingestellt. EXAMPLE
ist was für Leute, die selber eigene Speicherengines
für MySQL programmieren möchten. Bei FEDERATED
geht es um den Zugriff auf externe Datenbanktabellen und
BLACKHOLE
wird wohl hauptsächlich bei sehr großen Datenbanken und Replikationen eingesetzt. Details dazu findet ihr
hier. Konzentrieren wir uns also auf den Rest. Zunächst
mal kümmern wir uns um die "Unwichtigen".
ARCHIVE
Damit kann man sehr große Datenmengen abspeichern und hat trotzdem einen geringen Speicherbedarf. Leider gibt es hier keine Möglichkeit einen Index zu setzen.
CSV
Speichert die Tabellen im so genannten CSV-Format. Ich selber hatte noch nie damit zu tun, aber ihr könnt es gerne ausprobieren. Nur müsst ihr das ohne meine Hilfe machen.
3. Die "interessanten" Engines
MEMORY
Hier wird nur die Struktur in einer Datei abgespeichert. Die Inhalte selber landen direkt im Arbeitsspeicher. Der Vorteil ist, dass Abfragen rattenschnell abgearbeitet werden. Darum wird dieser Typ auch sehr gerne bei temporären Tabellen eingesetzt. Leider bringt das auch einen Nachteil mit sich. Sobald der Server heruntergefahren oder neu gestartet wird, gehen alle Einträge hops.
MyISAM
Dies war lange Zeit die Standardengine von MySQL. Leider gibt es dabei ein paar Nachteile, aber dazu komme ich gleich.
MERGE
Hier werden mehrere MyISAM-Tabellen zu einer zusammengefasst. Klingt interessant, aber da ich damit noch nie gearbeitet habe, ignoriere ich diesen Typ bis auf weiteres.
InnoDB
Hier wurden die Nachteile von MyISAM ausgemerzt, allerdings gibt es auch hier ein paar Probleme. Auf die Details gehe ich gleich ein.
4. Und welche Engines kann ich nutzen?
Dafür reicht eine einfache Anweisung aus, nämlich SHOW ENGINES;
. Und das Ergebnis könnte dann so aussehen. Die "unwichtigen"
Informationen habe ich aus Platzgründen einfach mal weggelassen.
+--------------------+---------+--------------+
| Engine | Support | Transactions |
+--------------------+---------+--------------+
| FEDERATED | NO | NULL |
| MRG_MYISAM | YES | NO |
| MyISAM | YES | NO |
| BLACKHOLE | YES | NO |
| CSV | YES | NO |
| MEMORY | YES | NO |
| ARCHIVE | YES | NO |
| InnoDB | DEFAULT | YES |
+--------------------+---------+--------------+
Wichtig
... sind hier die Spalten Support
und Transactions
. Erstere bezieht sich auf die Verfügbarkeit und die zweite
auf die Unterstützung von Transaktionen. Das DEFAULT
zeigt die Standardeinstellung, wenn man
beim Erzeugen einer Tabelle keine Speicherengine angibt. Unter Windows ist InnoDB
der Standard, unter Linux
MyISAM
.
5. Eine Speicherengine definieren
Dazu muss man beim Anlegen einer Tabelle einfach hinter der schließenden Klammer den Typ mittels ENGINE
angeben. Die ältere
Version TYPE
ist mittlerweile als "deprecated" (missbilligt) eingestuft worden.
CREATE TABLE blubb
(
...
) ENGINE=InnoDB;
CREATE TABLE blubber
(
...
) ENGINE=MyISAM;
Ein wichtiger Hinweis
Die Definition einer Engine bezieht sich auf Tabellen(!) und nicht auf Datenbanken! Man kann folglich in einer Datenbank Tabellen mit den unterschiedlichsten Formaten haben. Es gibt zwar ein paar Einschränkungen, aber darauf werde ich unter den folgenden Abschnitten dezidiert eingehen. Konzentrieren wir uns zunächst auf die beiden gängigsten Tabellentypen.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt