MySQLs Storage-Engines

Januar 12, 2009

Eine wirklich schöne Sache an MySQL ist, dass man sich die verwendete Storage-Engine für jede Tabelle einzeln aussuchen kann. Da für manche Anwendungsfälle bestimmte Storage-Engines hervorragend geeignet sind hat dies den Vorteil, dass von Fall zu Fall für jede Tabelle die ideale Storage-Engine gewählt werden kann.

Grundlagen

Tranksaktionen

Transaktionen ermöglichen es zusammenhängende Querys abhängig voneinander auszuführen. Hierzu wird zu Beginn der Transaktion quasi ein Snapshot der betroffenen Daten gemacht. Schlägt eine Query fehl, so wird ein Roll-Back durchgeführt und die Datenbank bleibt konsistent.

Fremdschlüssel

Hängen zwei Tabellen voneinander ab, so wird diese Abhängigkeit durch das eintragen des Primärschlüssels der ersten Tabelle als Fremdschlüssel in die zweite Tablle augelöst.

Wir haben beispielsweise zwei Tabelle:

Fotograf

Id Name
1 Zoran

Der Primärschlüssel ist Id.

Bild

Id Titel
1 Portrait
2 Landschaft

Der Primärschlüssel ist Id.

Jetzt gibt es jedoch keine möglichkeit herauszufinden welcher Fotograf welches Bild gemacht hat. Hierzu tragen wir den Primärschlüssel aus Fotograf in Bild ein:

Bild neu

Id Titel Fotograf_Id
1 Portrait 1
2 Landschaft 1

Locking

Um stets über konsistente Daten zu verfügen müssen Prozesse, die Daten verändern diese sperren können.

MyISAM

Wird für eine neu angelegte Tabelle keine Storage-Engine explizite angegeben, so wird MyISAM verwendet. MyISAM unterstütz keine Transaktionen. Es werden in der Standardkonfiguration bis zu 64 Indizes mit jebis zu 16 Spalten unterstützt. Ein Vorteil von MyISAM gegenüber InnoDB ist, dass MyISAM den geringeren Lock-Overhead hat, da Locking auf Tabellen-Ebene implementiert wird. Desweiteren bietet MyISAM eine schnelle Volltextsuche.

InnoDB

InnoDB wurde für die schnelle Verarbeitung von großen Datenmengen ausgelegt. Sie dürfte laut einem Interview mit Peter Zaitsev die meistverwendete Storage-Engine sein. Hierzu dürfte auch die Transaktionssicherheit von InnoDB beitragen. Die Kehrseite des hierzu notwendigen Locking auf Zeilen-Ebene ist ein sehr hoher Locking-Overhead.

InnoDB unterstützt auch Fremdschlüssel-Beschränkungen. Es gibt drei verschiedene Beschränkungen:

  1. ON (UPDATE | DELETE) CASCADE Löschungen/Änderungen in der Elterntabelle werden auf die Kindtabelle übertragen.
  2. ON (UPDATE | DELETE) SET NULL Bei Löschungen/Änderungen in der Elterntabelle werden die entsprechenden Fremdschlüssel der Kindtabelle auf NULL gesetzt. Voraussetzung: Die Fremdschlüssel dürfen nicht NOT NULL sein.
  3. NO ACTION Löschungen/Änderungen des Primärschlüssels in der Elterntabelle werden zurückgewiesen.

Memory (früher Heap)

Soll es sowohl beim Lesen als auch beim Schreiben richtig schnell gehen, ist Memory das Mittel der Wahl. Memory legt die Daten direkt im Speicher ab. Der Nachteil ist selbstverständlich, dass die die Daten nicht persistent sind, bei einem Reboot gehen sie also verloren. Eine mögliche Anwendung wäre z.B. eine Session-Tabelle.

3 Responses to “MySQLs Storage-Engines”

  1. [...] dazu ein wenig über das Thema MySQL zu bloggen. Zwei Posts sind aktuell in der Mache. Einer zu MySQLs Storage-Engines und einer zu Indizes in MySQL. Selbstverständlich werde ich mein neues Wissen auch gleich [...]

  2. [...] dem Artikel MySQLs Storage-Engines habe ich vielleicht dem ein oder anderen Leser etwas viel vor den Latz geknallt. Daher möchte ich [...]

  3. [...] speichert abhängig von der verwendeten Storage-Engine Datensätze unsortiert (z.B. MyISAM) oder nach Primärschlüssel sortiert (InnoDB). Dies hilft uns [...]

Leave a Reply