MySQL [ˌmaɪɛskjuːˈɛl] ist eines der weltweit verbreitetsten relationalen Datenbankverwaltungssysteme. Es ist als Open-Source-Software sowie als kommerzielle Enterpriseversion für verschiedene Betriebssysteme verfügbar und bildet die Grundlage für viele dynamische Webauftritte.
MySQL wurde seit 1994 vom schwedischen Unternehmen MySQL AB entwickelt. Im Februar 2008 wurde MySQL AB vom Unternehmen Sun Microsystems übernommen, das seinerseits im Januar 2010 von Oracle gekauft wurde. Der Name MySQL setzt sich zusammen aus dem Vornamen My, den die Tochter des MySQL AB Mitbegründers Michael Widenius trägt, und SQL.
Einsatzgebiete und Verbreitung
MySQL ist mit rund 50 Millionen Installationen (Stand: 2013) das populärste Open-Source-Datenbankverwaltungssystem der Welt. Ein bevorzugtes Einsatzgebiet von MySQL ist die Datenspeicherung für Webservices. MySQL wird dabei häufig in Verbindung mit dem Webserver Apache und der Skriptsprache PHP eingesetzt. Viele Webdienste bedienen sich dieser Architektur und betreiben je nach Größe und Bedarf eine Vielzahl von MySQL-Servern, über die die Zugriffe aus dem Netz abgewickelt werden. MySQL wird unter anderem verwendet von Flickr, YouTube, Google, Facebook und Twitter. Daneben wird MySQL in vielen Produkten als eingebettetes Datenbanksystem eingesetzt.
Plattformen und Schnittstellen
MySQL-Server und offizielle Bibliotheken sind zur Erzielung einer möglichst guten Performance hauptsächlich in ANSI C und ANSI C++ implementiert. MySQL ist auf vielen Unix-Varianten, Mac OS X und Linux, aber auch auf Windows, OS/2 und i5/OS (ehemals OS/400) lauffähig. Seit Anfang 2008 gibt es auch eine Symbian-Variante.
Struktur des verwendeten Speichersystems
MySQL sieht grundsätzlich einen MySQL-Server vor, auf dem Daten gespeichert sind, und einen oder mehrere MySQL-Clients, die Anfragen an den Server schicken, die dieser beantwortet. Auf dem Datenbankmanagementsystem, dem MySQL-Server, können mehrere Datenbanken erstellt werden. In einer Datenbank können mehrere Tabellen angelegt werden. Praktisch erstellt MySQL dabei für jede Datenbank einen Ordner auf der Festplatte, in dem Dateien für die Struktur und die Daten der einzelnen Tabellen abgelegt werden. Das genaue Format dieser Dateien hängt von der für die jeweilige Tabelle verwendeten Speicherengine ab.
Die Tabellen können jeweils von einem unterschiedlichen Typ sein. Der Tabellentyp legt fest, welche Speicherengine (Speichersubsystem) für Anfragen an eine Tabelle verwendet wird. Jede Tabelle kann Spalten enthalten, in denen Daten eines festgelegten Datentyps gespeichert werden können (z. B. Integer (ganze Zahlen) oder Strings (Zeichenketten)). Die maximale Größe der Tabellen wird grundsätzlich nur durch das Betriebssystem limitiert.
Ablauf der Verarbeitung einer Anfrage
Ein Client kann Datenbankanfragen an einen MySQL-Server schicken. Dieser ist dafür zuständig, jede Anfrage möglichst performant zu bearbeiten. Dabei wird zunächst der Query-Cache befragt und bei nicht vorhandenem Ergebnis die Anfrage geparst, optimiert und schließlich ausgeführt; das Ergebnis wird dann zurückgegeben.
Query-Cache
Um die Performance zu verbessern, kann MySQL die Ergebnisse von Anfragen in einem Zwischenspeicher, dem Query-Cache, ablegen. Sollte später eine identische Abfrage an den Server geschickt werden, ohne dass sich in der Zwischenzeit die Daten in der Datenbank verändert haben, wird sie aus dem Cache beantwortet. Es muss dann nicht auf die Datenbank selbst zugegriffen werden.
Parsing
Soll eine Query ausgeführt werden, wird zunächst geprüft, ob ihre Syntax gültig ist. Sie wird dazu in ihre einzelnen Komponenten zerlegt. Zugleich werden einige grundlegende Informationen über die Query gesammelt, wie etwa die Art der Query (z. B. SELECT, INSERT, SET oder GRANT), die betroffenen Tabellen oder die Inhalte des WHERE-Clauses. Am Ende dieses Schrittes kennt MySQL den Parse-Baum, der danach optimiert werden kann.
Optimierung
Ist eine Abfrage syntaktisch gültig, dann wird sie als Nächstes optimiert. Dabei sucht der Optimizer nach dem effizientesten Weg, die Query zu bearbeiten. Dazu wird hauptsächlich versucht, die Anzahl der zu lesenden Datensätze möglichst gering zu halten. Dies wird etwa, wenn Datensätze aus mehreren Tabellen gelesen werden müssen, durch eine geschickte Abfragereihenfolge (JOIN) der Tabellen erreicht; nicht benötigte Tabellen werden komplett aus dem JOIN entfernt.
Der Optimizer berücksichtigt unter anderem, ob es sinnvoll ist, zur Lokalisierung der gesuchten Datensätze einen Index zu verwenden (und wenn ja, welchen), oder ob es performanter wäre, stattdessen einen Table-Scan durchzuführen, d. h. die komplette Tabelle durchzulaufen. Die zur Verfügung stehenden Alternativen werden vom Optimizer bewertet. Dabei wird aufgrund von Heuristiken für jede Möglichkeit geschätzt, wie lange die Ausführung benötigen würde. Diejenige Alternative, die die geringsten Kosten hat, wird anschließend tatsächlich durchgeführt.
Die Arbeit des Optimizers lässt sich mit dem MySQL-Kommando EXPLAIN nachvollziehen. Dieser Befehl (gefolgt von einer bestimmten Query) beauftragt den Optimizer, seinen Query-Plan zurückzugeben. Als Ausgabe erhält der Nutzer Informationen für jeden Schritt, den der Optimizer zur Beantwortung der Query durchführen würde. Auf diese Art lässt sich mit etwas Hintergrundwissen ermitteln, inwiefern die Query optimiert werden kann, so dass sie schneller ausgeführt werden kann.
Geschichte
Michael Widenius und David Axmark begannen 1994 mit der Entwicklung von MySQL. Es wurde zunächst als Clone für mSQL entwickelt, um Datenbanken des maskengesteuerten Datenbanksystems UNIREG in Web-Anwendungen verfügbar zu machen. (UNIREG war 1979 von Michael Widenius entwickelt und ca. 1986 in die Programmiersprache C umgeschrieben worden, damit es auch unter UNIX-Systemen lief.)
MySQL war daher sowohl zu mSQL als auch UNIREG voll kompatibel. Nach einem internen Release am 23. Mai 1995 wurde die Software im Jahr 1997 sofort unter der Versionsnummer 3.1 veröffentlicht, um zu signalisieren, dass sie auf einem Kern basiert, der schon eine lange Geschichte hat. Sie war von Anfang an für große Datenmengen und sehr gute Performance ausgelegt, teils auf Kosten von Stabilität und Verfügbarkeit.
Die Menge der Eigenschaften hingegen war zunächst beschränkt. So gab es nur wenige Tabellentypen und keine Transaktionen. Typischerweise werden neue Eigenschaften auf Wunsch der Anwender implementiert, die dadurch ein sehr großes „Mitspracherecht“ haben.
Mit der im Januar 2001 veröffentlichten Version 3.23 verfügte MySQL über zwei Tabellentypen mit Transaktionen, wobei der eine (InnoDB) den ACID-Kriterien genügt. Alle Operationen, die allgemeine SQL-Eigenschaften betreffen, sind für alle Tabellentypen gleich, während die Eigenschaften der Tabellentypen aufgrund der unterschiedlichen Architektur sehr verschieden sein können. So besitzt der Typ MyISAM bereits seit der frühen Version 3.23 eine sehr leistungsfähige Volltext-Suche, die beim Typ InnoDB nicht implementiert ist.
Neu in Version 3.23 ist ebenfalls das Replikationssystem. Es ist für den Einsatz in einem Rechnerverbund ausgelegt und bietet sich für einen unterbrechungsfreien Betrieb an. Dabei sind dem Datenbankmanagementsystem (DBMS) mehrere Datenbanken auf unterschiedlichen Rechnerknoten zugeordnet. Eine der Datenbanken fungiert als Master; hier werden die Datenbankinhalte verändert. Das Replikationssystem verteilt anschließend die datenverändernden SQL-Kommandos auf die anderen Datenbanken, die diese Änderungen lokal auf ihren Tabellen nachvollziehen.
Es handelt sich hierbei also um eine asynchrone Replikation der SQL-Kommandos. Mit dem MySQL Cluster steht ein Tabellentyp zur Verfügung, bei dem die gesamte Datenbank im Arbeitsspeicher als In-Memory-Datenbank vorgehalten werden kann. Es wird synchrone Replikation zwischen allen Clusterknoten und Transaktionsverarbeitung unterstützt, jedoch keine Volltextsuche.
MySQL 4.0, das im März 2003 freigegeben wurde, erlaubt die Nutzung von Unions und führte einen Query-Cache ein, der die Ergebnisse häufig benutzter SQL-Anfragen zwischenspeichert. Im Oktober 2004 wurde MySQL 4.1 veröffentlicht. Es bietet eine Datenspeicherung in unterschiedlichen Zeichensätzen pro Tabelle an; unter anderem wird auch Unicode unterstützt. Unterabfragen (Subqueries/Subselects) sind möglich.
Version 5.0 wurde im Oktober 2005 freigegeben. Sie unterstützt alle im SQL3-Standard definierten Objekttypen. Neu in Version 5 ist dabei die Unterstützung von Views, Triggern, Stored Procedures und User Defined Functions. Im Februar 2008 übernahm Sun Microsystems MySQL AB. Als Kaufwert wird eine Milliarde Dollar genannt; davon 200 Millionen in Aktienoptionen.
Im November 2008 wurde MySQL 5.1 freigegeben. Zu den Neuerungen zählen außer Partitionsfunktionen, mit denen sehr große Tabellen in mehrere physikalische Dateien aufgeteilt werden können, ein Event-Scheduler, mit dessen Hilfe zuvor definierte SQL-Kommandos in regelmäßigen Zeitabständen ausgeführt werden können, sowie Funktionen des Instanzenmanagers. Die API wurde überarbeitet, so dass nun das Laden und Entladen von Komponenten während der Laufzeit und ohne Neustart des Servers möglich ist.
Im Januar 2010 wurde Sun Microsystems von Oracle gekauft. Wenige Monate später gab Oracle bekannt, dass die bereits von MySQL AB begonnene Entwicklung der Datenbank-Engine Falcon eingestellt wird.
Ende 2010 wurde MySQL 5.5 veröffentlicht. InnoDB wurde zur Standard-Speicherengine. Die Performance wurde durch die Nutzung von asynchronem I/O verbessert. Neu sind auch die Kommandos SIGNAL/RESIGNAL, die standardkonforme Fehlerbehandlung in Stored Procedures erlauben.
Das im Jahr 2012 veröffentlichte MySQL 5.6 umfasst u. a. Memcached APIs, globale Transaktions-IDs und Verbesserungen am PERFORMANCE_SCHEMA.
Kritik
Seit der Übernahme von MySQL AB von Sun durch Oracle steht das Datenbanksystem immer häufiger in der Kritik. Der Unterschied zwischen der freien und kommerziellen Version von MySQL wird immer gravierender. Neue Funktionen sind häufig nur noch in der kommerziellen Version von MySQL enthalten, dazu kommen nicht-öffentliche Fehlermeldungen, veraltete Bazaar-Archive und fehlende Tests für die Fehlersuche.
Seit Ende 2012 erodiert auch der Rückhalt in der OpenSource-Gemeinschaft für MySQL. Nach Fedora und OpenSuse haben Anfang 2013 auch Slackware und Arch Linux das MySQL-Paket durch MariaDB ersetzt. Auslöser sind der mangelnde Respekt gegenüber der Gemeinschaft und die zunehmend abgeschottete Entwicklung des RDBMS. Ebenso wechselte die Wikimedia-Foundation Anfang 2013 zu MariaDB.
Jaroslav Reznik, Red Hats Fedora-Projekt-Manager erklärte, dass sich MySQL in Richtung eines geschlossenen Projektes entwickle. Alle nützlichen Informationen zu Sicherheitsfragen (CVEs) würden nicht mehr veröffentlicht. Es existierten keine vollständigen Regressionstests mehr und ein sehr großer Teil der MySQL-Bug-Datenbank sei nun nicht mehr öffentlich.
Michael Widenius, der ehemalige Gründer von MySQL AB kritisiert Oracle scharf: Oracle habe klargemacht, dass sie kein Interesse an Open Source hätten, die Zusammenarbeit mit der Community ablehnten und auch MySQL im Allgemeinen nicht mögen würden. Als Beispiele für die Missachtung der Open-Source-Prinzipien nennt er die kommerziellen Erweiterungen für MySQL, die inzwischen nichtöffentliche Fehler-Datenbank und den Mangel an Testfällen für neuen MySQL-Code.
Vorzeige-Funktionen, wie das Online-Backup und Fremdschlüssel für alle Speicher-Engines, die für MySQL 6.0 versprochen wurden, seien nicht veröffentlicht worden, obwohl sie fertig entwickelt und bereit seien. Statt Fehler zu beheben, entferne Oracle Funktionen. Die meisten der ursprünglichen MySQL-Entwickler hätten Oracle verlassen. Als weitere Beweise für die „Verachtung“ der MySQL-Anwender nennt er den „scharfen“ Anstieg der Lizenz- und Support-Gebühren und das Fehlen einer offenen Roadmap.
Quelle: Wikipedia (http://de.wikipedia.org/wiki/MySQL)