MySQL-DBMS

Was ist MySQL?

MySQL ist eines der weltweit am weitesten verbreitetsten relationalen Datenbankmanagementsysteme (DBMS). MySQL gibt es als kostenlose Open-Source-Software unter der GPL-Lizenz und als kostenpflichtige proprietäre Software mit zusätzlichen Werkzeugen (z. B. Monitoring und Backup) und 24x7 Support. MySQL ist für die Betriebssysteme Windows, Linux, macOS und verschiedene Unix-Varianten verfügbar und bietet zahlreiche Schnittstellen (API‘s) für Programmier-sprachen wie Java und PHP und die Softwareplattform .NET.

Die Entwicklung von MySQL begann 1994 durch Michael Widenius und David Axmark, die für das schwedische Unternehmen MySQL AB arbeiteten. Das erste Release von MySQL wurde 1997 mit der Versionsnummer 3.1 veröffentlicht. 2008 wurde MySQL AB von Sun Microsystems übernommen, das selbst wiederum 2010 von Oracle übernommen wurde. Seitdem steht das Datenbanksystem zunehmend in der Kritik. Oracle zeigt kaum Interesse an der Unterstützung der Open-Source-Version, wodurch die freie und die kommerzielle Version von MySQL immer weiter auseinanderdriften. Bereits 2009 begann Michael Widenius auf der Codebasis von MySQL 5.5 einen eigenständigen Zweig mit dem Namen MariaDB weiterzu-entwickeln. MariaDB soll dabei kompatibel zu der durch Oracle entwickelten kommerziellen Version von MySQL gehalten werden. Die beiden DBMS MySQL und MariaDB wurden nach den Kindern von Michael Widenius My und Maria benannt.

Eines der typischsten Einsatzgebiete von MySQL ist die Datenspeicherung für Webanwendun-gen. Dabei wird MySQL häufig in der Kombination mit dem Betriebssystem Linux, dem Webserver Apache und der Backend-Programmiersprache PHP eingesetzt. Diese Kombi-nation wird auch als LAMP-Stack (Linux, Apache, MySQL, PHP) bezeichnet. So verwenden u. a. Facebook, YouTube, Twitter und Flickr MySQL als DBMS für ihre Webanwendungen.

Funktionsweise von MySQL

MySQL verfolgt das Client-Server-Prinzip, bei dem es einen MySQL-Server gibt, der Anfragen von mehreren MySQL-Clients beantwortet. Auf dem MySQL-Server können mehrere Daten-banken angelegt werden. In einer Datenbank können mehrere Tabellen angelegt werden die wiederum mehrere Spalten mit unterschiedlichen Datentypen (Zahlen, Zeichenketten, etc.) haben können. Der MySQL-Server legt dabei für jede Datenbank einen Ordner auf der Fest-platte an, der Informationen zur Struktur der Tabellen und die Daten selber enthält.

Speicherengines

MySQL bietet mehrere verschiedene Speicherengines (auch Speichersubsysteme oder Storage Engines) an, die für das effektive Speichern und Abfragen von Daten zuständig sind. Dazu sind alle Speicherengines für einen bestimmten Zweck optimiert. Sie bieten unter-schiedliche Funktionalität (wie z. B. Transaktionssicherheit) und eine unterschiedliche Performance. Die gewünschte Speicherengine kann beim Erstellen einer Tabelle ausgewählt werden. Neben den mit MySQL mitgelieferten Speichereingines (siehe die folgenden Punkte) gibt es auch Speicherengines anderer Hersteller.

InnoDB

InnoDB ist die Standard-Speicherengine seit MySQL 5.5. Sie bietet transaktionssichere Lese- und Schreibzugriffe durch Begin-, Commit- und Rollback-Funktionen und bietet die Möglichkeit Fremdschlüssel-Beziehungen zu überprüfen.

MyISAM

MyISAM bietet schnellen Zugriff auf Tabellen ohne Transaktionssicherheit. Die gute Performance wird u. a. durch parallele Datenbankzugriffe ermöglicht. Außerdem bietet MyISAM eine Volltextsuche und eine gute Portierbarkeit der Tabellen auf andere Computer.

MERGE

Mit MERGE können mehrere MyISAM-Tabellen mit gleicher Struktur zu einer Tabelle zu-sammengefasst werden. Dabei können auch komprimierte und nicht-komprimierte MyISAM-Tabellen zusammengefasst werden.

MEMORY

Bei MEMORY werden nur die Tabellendefinitionen auf der Festplatte permanent gespeichert, während die Daten selber im Hauptspeicher gehalten werden. Bei einem Neustart des Servers müssen die Daten zunächst aus permanenten Tabellen eingelesen werden.

ARCHIVE

ARCHIVE ist für die Speicherung von großen Datenmengen optimiert und nutzt dabei den verfügbaren Speicherplatz optimal aus. Beim Schreiben werden die Daten erst in einem Kompressionspuffer gesammelt, dann der optimale Kompressionsalgorithmus ermittelt und die Daten dann komprimiert gespeichert. Nachteile sind eine schlechte Performance, dass keine Indizes erstellt werden können und nur INSERT- und SELECT-Zugriffe unterstützt werden.

FEDERATED

Mit FEDERATED kann auf entfernte Datenbanken zugegriffen werden, die auf einem anderen Server liegen. Dabei muss die Datenbank auf dem anderen Server bereits existieren. Die FEDERATED-Engine verhält sich dabei wie ein Client, der die Daten von dem anderen Server bezieht, aber nicht lokal speichert.

NDB

NDB (Network Data Base) ermöglicht den Zugriff auf Datenbanken in einem MySQL-Cluster. Dabei werden die Datenbanken auf verschiedene Server verteilt, um die Verfügbarkeit, die Rechenleistung oder die Speicherkapazität zu erhöhen. NDB ist außerdem eine multi-threading-fähige Engine, die für jede Anfrage ein oder mehrere Threads startet.

CSV

Die CSV-Speicherengine speichert die Daten im CSV-Format, d. h. in einem Komma-separierten Format.

BLACKHOLE

Mit BLACKHOLE können SQL-Anweisungen getestet werden, ohne dass dabei Daten geschrieben werden. Wahlweise können dabei Binärlogs erstellt werden, die dann zur Prüfung des Ergebnisses verwendet werden können. So können Replikationen testweise ausgeführt und anschließend zur Prüfung die Binärlogs auf den Servern verglichen werden.

EXAMPLE

EXAMPLE ist eine Vorlage zum Erstellen von eigenen Speicherengines. Dabei sind nur Funktionen zum Erstellen von Tabellen ausprogrammiert, aber die restlichen Funktionen sind nur angedeutet und müssen selber fertig programmiert werden.

Partitionierung

Bei der Partitionierung von Datenbanken werden die Daten aufgeteilt und separat gespeichert. Dabei können die Partitionen auch auf unterschiedlichen Servern verwaltet werden. MySQL bietet verschiedene Verfahren zur Partitionierung an und ermöglicht auch das Erstellen von Unterpartitionen, mit denen einzelne Partitionen noch weiter untergliedert werden können.

Range-Partitionierung

Bei der Range-Partitionierung werden die Partitionen auf Basis von Wertebereichen gebildet. Die Daten werden dann in Abhängigkeit der Werte des definierten Attributs auf die Partitionen aufgeteilt:

Hinweis: Der „Table Inspector“ von MySQL zeigt auf dem Reiter „Partitions“, dass 5 Datensätze auf die erste Partition und 5 Datensätze auf die zweite Partition aufgeteilt wurden!

List-Partitionierung

Bei der List-Partitionierung werden die Partitionen auf Basis von Wertelisten gebildet. Hier werden die Daten abhängig davon zu welcher Liste die Werte des definierten Attributs passen auf die Partitionen aufgeteilt:

Hinweis: Hier zeigt der „Table Inspector“, dass jeweils 4 Datensätze auf die erste und zweite Partition und 2 Datensätze auf die dritte Partition aufgeteilt wurden!

Hash-Partitionierung

Bei der Hash-Partitionierung werden die Partitionen vom DBMS mit Hilfe von Hash-Funktionen definiert. Die Hash-Funktion wird auf die Werte des definierten Attributs angewendet und so auf die einzelnen Partitionen verteilt. Der große Vorteil der Hash-Partitionierung ist, dass hier kein Wertebereich und keine Liste angegeben werden muss und so immer alle Werte aufgeteilt werden können:

Hinweis: Der „Table Inspector“ zeigt, dass die Werte gleichmäßig auf die vier Partitionen aufgeteilt wurden.

Die Key-Partitionierung ist ein Sonderfall der Hash-Partitionierung, bei der die Hash-Funktion auf die Werte des Primärschlüssels angewendet wird:

Optimierung

Eine wichtige Aufgabe des DBMS ist es alle SQL-Anweisungen möglichst performant zu bearbeiten. Dazu gibt es bei MySQL den Query-Cache und den Optimizer.

Query-Cache

Der Query-Cache ist eine Ablage, in dem MySQL die Ergebnisse von Anfragen speichert. Wird die selbe Anfrage erneut gestellt und hat sich der entsprechende Datenbestand in der Zwischenzeit nicht verändert, wird das Ergebnis aus dem Query-Cache ausgegeben. Damit muss MySQL nicht auf die entsprechende Datenbank oder Datenbanken zugreifen, wodurch Anfragen erheblich schneller beantwortet werden können.

Optimizer

Der Optimizer ermittelt den effizientesten Weg, um Anfragen zu bearbeiten. Dazu werden die Anfragen zunächst von einem Parser in einzelne Komponenten zerlegt und Informationen zur Art der Anfrage (SELECT, INSERT, etc.) und die betroffenen Tabellen gesammelt. Da die Reihenfolge der Abarbeitung der Komponenten einer Abfrage variieren können, ermittelt der Optimizer für alle möglichen Varianten die dafür benötigten Lesezugriffe. Zuletzt wird die benötigte Zeit für alle Varianten geschätzt und die mit der kürzesten Zeit gewählt.

Hinweis: Wird das MySQL-Kommando „EXPLAIN“ vor eine Abfrage gesetzt, werden Informationen darüber ausgegeben, welche Schritte der Optimizer bei der Abarbeitung einer Abfrage durchführt!

Bedienung von MySQL

Zur Verwaltung der MySQL-Datenbanken können der MySQL-Kommandozeilen-Client oder die MySQL-Workbench verwendet werden, sowie Werkzeuge anderer Hersteller, wie z. B. HeidiSQL oder PHPMyAdmin.

MySQL-Kommandozeilen-Client

Mit dem MySQL-Kommandozeilen-Client können SQL-Anweisungen eingegeben und die Abfrage-Ergebnisse in einem ASCII-Tabellen-Format ausgegeben werden:

Der MySQL-Kommandozeilen-Client kann wie folgt über die Betriebssystem-Shell gestartet werden:

MySQL-Workbench

Die MySQL-Workbench ist ein grafisches Werkzeug zur Administration von MySQL-Servern und Serververbindungen sowie zur Modellierung, Erstellung, Verwaltung und Migration von MySQL-Datenbanken:

Werkzeuge anderer Hersteller

HeidiSQL ist ein kostenloses grafisches Werkzeug zur Administration von Datenbank-systemen wie MySQL, MariaDB, Microsoft SQL und PostgreSQL:

PHPMyAdmin ist ein kostenloses grafisches Werkzeug zur Administration von MySQL- und MariaDB-Datenbanken. PHPMyAdmin ist eine freie Software unter der General Public License und in PHP geschrieben:

Quellen