Die Speicher-Engines in MySQL 5

24.02.2006
Von 
Jan Schulze ist freier Autor in Erding bei München.
Die Open-Source-Datenbank "MySQL" erlaubt den Einsatz verschiedener Speicher-Engines. Für die Anwender ist das nicht leicht zu durchschauen, es macht die Datenbank aber sehr flexibel.
Je nach Anforderungen der Datenbank-Applikation können sich MySQL-Anwender für eine der dafür geeigneten Engines entscheiden.
Je nach Anforderungen der Datenbank-Applikation können sich MySQL-Anwender für eine der dafür geeigneten Engines entscheiden.

Von Jan Schulze*

Transaktionen

Transaktionen sind Pakete aus mehreren Operationen, die untrennbar zusammengehören. Wird eine Operation nicht ausgeführt, ist die gesamte Transaktion fehlgeschlagen. Kann eine Operation einer Transaktion nicht fehlerfrei ausgeführt werden, müssen alle vorhergegangenen Operationen wieder rückgängig gemacht werden. Damit lässt sich sicherstellen, dass eine Datenbank zum einen stets konsistent ist und zum anderen die gewünschten Änderungen in den Tabellen sicher geschrieben wurden. Allerdings fordern Transaktionen etwas mehr Zeit als reine Operationen.

Die Engines im Überblick

Engine Besonderheit

MyISAM Performance-optimierte Standard-Engine seit MySQL 3.23.

Memory Hash-basierende Engine, die die Daten im Hauptspeicher hält.

InnoDB Unterstützt unter anderem Transaktionen und Locking auf Zeilenebene.

BerkeleyDB Unterstützt unter anderem Transaktionen und Locking auf Seitenebene.

Blackhole Speichert nach /dev/nul - alles, was geschrieben wird.

Example Beispiel-Engine.

Archive Archivierungs-Engine.

CSV Speichert Daten als Komma-getrennte Werte (Comma Separated Values).

NDB Cluster Fehlertolerante Cluster-Engine, speichert die Datenbank auf verteilten Servern.

Federated Engine zur Arbeit mit entfernten Tabellen.

MRG MyISAM Sammlung identischer MyISAM-Tabellen.

Binlog Meta-Speicher-Engine für Transaktions-Logs.

ISAM Vorgänger von MyISAM, heute obsolet.

Mehr zum Thema

www.computerwoche.de/go/

566847: Wo sich der Einsatz von MySQL 5 lohnt;

569961: Datenbankriesen fürchten Open Source.

Datenbank ist nicht gleich Datenbank. Denn es gibt unzählige Möglichkeiten, Daten in Tabellen zu speichern, zu indexieren und abzufragen. Jede Methode hat ihre Vor- und Nachteile, je nach Einsatzgebiet: Sollen kleine Datenmengen in großer Zahl geschrieben und gelesen werden, wie das zum Beispiel bei Internet-Anwendungen der Fall ist, oder müssen die Informationen etwa in einem ERP-System transaktionssicher verarbeitet werden? Jedes Szenario benötigt andere Arten der Datenhaltung.

Module nach Bedarf

Hier liegt eine Besonderheit von MySQL: Sie besitzt eine Architektur, die den Einsatz verschiedener Speicher-Engines erlaubt. Sie bestimmen die Art, wie die Daten einer Datenbank physikalisch gespeichert werden. Einer Datenbank - oder genauer jeder Tabelle - wird beim Anlegen eine bestimmte Speicher-Engine zugewiesen. Der MySQL-Server kann gleichzeitig Datenbanken mit verschiedenen Engines verwalten. Die Speicher-Engines verhalten sich im Wesentlichen wie Module, die in die Software integriert werden. Kommt eine neue Engine hinzu, muss der Basiscode nicht oder nur wenig angepasst werden.

Die Gründe für diese Architektur liegen in der Geschichte der Datenbank und der Open-Source-Tradition: Ursprünglich war MySQL nicht auf eine große Anzahl an Merkmalen hin entwickelt worden, sondern auf Leistungsfähigkeit in wenigen Bereichen. Es liegt in der Natur freier Software, dass viele Wünsche für die weitere Entwicklung eines Programms von den Anwendern kommen - auch für Nischenlösungen, was dann meist in Form austauschbarer Engines realisiert wurde. Ein Vorteil dieses Prinzips: Es führt zu schlanken Lösungen, da nur die benötigten Module auch wirklich installiert werden.

Diverse Datenspeicher

Im Fall von MySQL speichern einige Engines die Daten auf Festplatten, andere halten sie wegen des schnelleren Zugriffs im Hauptspeicher (In-Memory). Die Cluster-Speicher-Engine legt die Tabellen in einem Server-Netz ab. Und auch in anderen Bereichen wie etwa dem "Locking", der Verwaltung von zeitgleichen Zugriffen verschiedener Anwendungen oder Benutzer auf einen Datensatz, gibt es beträchtliche Unterschiede.

Mittlerweile unterstützt MySQL in der aktuellen Version 5 von Haus aus 13 Speicher-Engines für verschiedene Einsatzzwecke. Am bekanntesten ist "MyISAM", der Nachfolger der ursprünglich eingesetzten ISAM-Engine und seit Version 3.23 der Standard des Open-Source-Systems. ISAM steht für Indexed Sequential Access Method. Es speichert die Daten der einzelnen Tabellen in zwei Dateien - eine für die eigentlichen Daten, eine für den Index. Als sequenzielle Speicher-Engine erlaubt MyISAM immer nur den Schreibzugriff durch eine Anwendung.

Es ist also nicht möglich, dass mehrere Applikationen oder Benutzer gleichzeitig in die Tabelle schreiben. Dagegen können sehr wohl mehrere Benutzer gleichzeitig die Tabelle lesen. Mit dieser Engine angelegte Tabellen können Volltext-indexiert werden. Das Suchen und Finden von gespeicherten Texten geschieht also sehr schnell. MyISAM ist vor allem als Backend für Web-Seiten verbreitet, wo viele kleine Datenpakete schnell gelesen werden müssen und wo damit zu rechnen ist, dass mehrere Anwender gleichzeitig auf die Datenbank zugreifen.

Der Nachteil von MyISAM ist, dass diese Engine keine Transaktionen verarbeiten kann, wie es zum Beispiel für den Einsatz in Warenwirtschaftssystemen notwendig wäre. Hierfür steht bei MySQL die Engine InnoDB bereit, eine Entwicklung der finnischen Innobase Oy. Sie entspricht dem Acid-Standard (Atomicity Consistency Isolation Durabilty): Es ist zum Beispiel sichergestellt, dass entweder alle Statements eines Zugriffs auf die Datenbank ausgeführt werden oder keines. Unvollständige Zugriffe sind damit nicht möglich; war die Datenbank vor einer Transaktion konsistent, ist sie es auch danach. Alle Transaktionen laufen voneinander isoliert ab, sie können sich nicht gegenseitig beeinflussen. Erst wenn eine Transaktion abgeschlossen ist, wird sie auf Festplatte geschrieben.

Ein weiterer Unterschied zu MyISAM ist, dass beliebig viele Anwendungen gleichzeitig in eine InnoDB-Tabelle schreiben können. Die einzige Einschränkung ist das Row-Level Locking: Es darf immer nur eine Anwendung auf eine bestimmte Zeile der Tabelle zugreifen. Im Gegensatz zu MyISAM wird bei InnoDB nicht die ganze Tabelle mit einem Locking versehen, sondern nur eine gerade benutzte Zeile.

Keine gravierende Auswirkung

InnoDB hat Ende des vergangenen Jahres für Schlagzeilen gesorgt, als der Hersteller vom Datenbankanbieter Oracle gekauft wurde. Die langfristigen Auswirkungen dieser Übernahme sind zwar noch nicht abzusehen, mittel- und kurzfristig müssen sich MySQL-Anwender jedoch keine Gedanken über das Thema machen, meint Carlo Velten, Senior Advisor der Experton Group: "MySQL besitzt durch seine flexible Architektur die Grundlage dafür, bei Bedarf schnell eine andere Speicher-Engine in das Produkt zu integrieren."

Dieser Meinung ist auch der Datenbankanbieter selbst: "InnoDB ist eine hervorragende transaktionale Datenbank-Engine, aber sie ist nicht die einzige", so Bertrand Matthelié, Marketing-Director bei MySQL. Der Hersteller arbeitet gemeinsam mit einigen Partnern daran, verschiedene Alternativen zu InnoDB zu evaluieren. Da InnoDB unter der Open-Source-Lizenz GPL steht, sind die Anwender nicht an einen Hersteller gebunden und haben auch in Zukunft die Freiheit, diese Software zu verändern, zu erweitern und weiterzugeben.

Eine noch recht junge Speicher-Engine bei MySQL ist "NDB Cluster". Sie ist für den Einsatz in großen, hochverfügbaren und skalierbaren Umgebungen gedacht. Hierbei wird der Inhalt der Tabellen auf die einzelnen Knoten eines Clusters verteilt und dort im Hauptspeicher gehalten. Um Datenverluste für den sehr unwahrscheinlichen Fall eines Komplettausfalls des gesamten Clusters zu vermeiden, sichern die einzelnen Knoten ihren Datenteil regelmäßig auf Festplatte. Das Cluster ist transaktionsfähig und beherrscht Locking auf Zeilenebene.

Datenbank-Cluster

Geclusterte Datenbanken haben zwei große Vorteile gegenüber Datenbanken auf einem großen Server: Durch den Einsatz vieler kleiner Standardmaschinen ist das Gesamtsystem hoch verfügbar. Fällt ein Knoten aus, übernimmt sofort ein anderer dessen Aufgabe. Zudem lassen sie sich leicht skalieren, indem bei Bedarf einfach weitere Knoten in den Verbund aufgenommen werden.

Ebenfalls mit Datenhaltung im Hauptspeicher arbeitet die "Memory-Engine". Im Gegensatz zum Cluster werden die Tabellen jedoch nur auf einem Server gespeichert. Somit sind sie in der Größe auf den Speicher dieser Maschine beschränkt und nicht für umfangreiche Datenmengen geeignet. Zudem sichert die Memory-Engine die Daten nicht auf einen Massenspeicher. Wird der Server herunter gefahren, sind die Tabelleninhalte verloren. Dafür ist die Memory-Engine durch die Datenhaltung im RAM extrem schnell.

Neu im aktuellen MySQL-Release sind die Speicher-Engines "Federated" und "Archive". Federated dient dazu, Tabellen von einem entfernten Server zu benutzen. Diese können ihrerseits auf einer beliebigen Engine basieren. Durch die Federated-Engine ist der Zugriff auf die entfernten Tabellen so möglich, wie wenn diese auf dem lokalen Server gespeichert wären. Archive dagegen ist auf die Archivierung von Tabellen spezialísiert. Sie beherrscht nur Insert- und Select-Befehle und ist dadurch sehr schlank und schnell. Archive kann da eingesetzt werden, wo keine Daten mehr verändert werden müssen.

Anwender stehen vor der nicht ganz einfachen Aufgabe, aus der Vielzahl die jeweils richtige Speicher-Engine auszuwählen. Denn sie haben nicht nur im täglichen Betrieb jeweils eigene Vor- und Nachteile, sondern verhalten sich auch beim Backup und in anderen Bereichen teilweise sehr unterschiedlich. Eine falsche Entscheidung ist dabei jedoch keine unabänderliches Fehlinvestition, vielmehr las- sen sich die Engines bereits angelegter Tabellen jederzeit ändern. (ue)