Die Neuerungen in MySQL 5.1

Mit neuen Funktionen will sich MySQL 5.1 mehr denn je als "große" Datenbank für Unternehmen empfehlen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 13 Min.
Von
Inhaltsverzeichnis

Drei Jahre haben sich Entwickler seit dem großen Sprung auf MySQL 5.0 Zeit gelassen, bis sie nach zahlreichen Vorabversionen die neue Version 5.1 der populären Datenbank freigegeben haben. MySQL 5.1.30 (General Availability) steht auf zahlreichen Mirror-Servern zum Download bereit.

Die wohl wichtigste Neuerung in MySQL 5.1 sind die Partitionierungsfunktionen. Damit ist es möglich, sehr große Tabellen über mehrere physikalische Dateien und Festplatten zu verteilen. MySQL unterstützt dabei die so genannte horizontale Partitionierung, bei der Datensätze anhand eines Kriteriums ausgewählt und an verschiedenen Orten gespeichert werden, wobei sich insbesondere DATE-Spalten für die Partitionierungsfunktion anbieten. Vertikale Partitionierung, also die getrennte Speicherung verschiedener Spalten, wird nicht unterstützt, lässt sich aber mit relativ wenig Aufwand durch eine zweite Tabelle – beispielsweise mit selten benutzten BLOB-Feldern – selbst realisieren.

In der Vergangenheit hat man Datenbank-Partitionierung häufig eingesetzt, um die Größenlimits von Festplatten zu umgehen. Im Zeitalter von RAID, LVM und Terabyte-Festplatten rückt ein anderes Argument in den Vordergrund: Partitionierung kann Datenbankabfragen stark beschleunigen. Wenn eine Tabelle beispielweise Datensätze von 1980 bis 2010 enthält und nach dem Datum in sechs Teiltabellen zerlegt wird, muss für eine Abfrage der Art "SELECT ... WHERE datum BETWEEN 2003 AND 2004" nur eine der Teiltabellen konsultiert werden. Anstatt eine Million Datensätze zu verarbeiten, sind weniger als 200.000 Datensätze zu berücksichtigten. Theoretisch lassen sich Abfragen mit speziellen Funktionen (zum Beispiel SUM oder COUNT) über partitionierte Tabellen auch über mehrere Threads verteilen, diese Optimierungsform unterstützt MySQL aber noch nicht. Auch sonst gibt es für partitionierte Tabellen diverse Einschränkungen, die etwa die Formulierung der Partitionierungsfunktion oder den Einsatz von Foreign-Key-Regeln betreffen.

Ebenfalls neu ist der sogenannte Event Scheduler. Diese Komponente kümmert sich darum, zuvor definierte SQL-Kommandos in regelmäßigen Zeitabständen auszuführen. Das MySQL-Handbuch vergleicht diese Funktion mit cron-Jobs unter Unix/Linux.

Anwendungsmöglichkeiten für diese Funktion gibt es viele: Die regelmäßige Protokollierung des Datenbankzustands, automatische Backup- oder Synchronisationsdienste (wobei es hierfür eher die Replikationsfunktionen von MySQL anbieten), die regelmäßige Generierung von Tabellen mit häufig benötigten Abfrageergebnisse (etwa Top-10-Listen, die einmal stündlich oder einmal täglich generiert werden und dann blitzschnell zur Verfügung stehen) und so weiter. Ein gravierender Nachteil derartiger Events besteht allerdings darin, dass es sich hier um eine MySQL-Eigenentwicklung fernab irgendwelcher SQL-Standards handelt.

Auch die Replikationsfunktionen zur Synchronisation einer Datenbank über mehrere MySQL-Server wurden erweitert: Bisher führte der Replikations-Slave einfach alle am Replikations-Master ausgeführten SQL-Kommandos nochmals aus. Die neue datensatzbasierte Replikation erlaubt es, direkt die geänderten Daten zu übertragen. Das ist in manchen Fällen effizienter und erlaubt die Replikation auch beim Einsatz nicht deterministischer Funktionen wie UUID(). Standardmäßig gilt nun ein Mischmodus, bei dem die datensatzbasierte Replikation nur eingesetzt wird, wenn dies erforderlich ist oder einen Geschwindigkeitsvorteil verspricht.

Die virtuelle information_schema-Datenbank ermöglicht seit MySQL 5.0 die Abfrage nach diversen Metainformationen: welche Datenbanken und Tabellen existieren, welche Merkmale deren Spalten haben, welche Benutzer, Trigger, Stored Procedures und Views definiert sind und so weiter. In MySQL 5.1 wurde der Umfang dieser Datenbank stark erweitert und ist ein wichtiges Hilfsmittel für diverse administrative Aufgaben.

Eine Besonderheit von MySQL besteht darin, dass es unterschiedliche Tabellentypen gibt, die durch verschiedene Datenbank-Engines wie MyISAM und InnoDB realisiert werden. Neu in MySQL 5.1 ist ein Plugin-API, mit der sich Engines nachträglich hinzufügen und entfernen lassen. Momentan wirkt dieses API noch etwas ausgegoren – so muss jedes Plugin für jede MySQL-Subversionsnummer neu kompiliert werden. Tabellen-Plugins sind daher derzeit wohl eher ein Hilfsmittel für Entwickler als eine bequeme Erweiterungsmöglichkeit. Längerfristig könnten Tabellen-Plugins aber ein interessantes Marktsegment öffnen, in dem Anbieter für spezielle Aufgaben optimierte MySQL-Plugins anbieten.

Eine eigentlich naheliegende Idee ist es, Protokollinformationen nicht in gewöhnliche Dateien zu schreiben, sondern in Tabellen. MySQL 5.1 bietet diese Möglichkeit für das General Query Log und das Slow Query Log (aber nicht für das für die Replikation erforderliche Binary Log). Allerdings hat sich gezeigt, dass diese Funktion den MySQL-Server in manchen Anwendungen ausbremsen kann. Das reduziert den Wert dieser neuen Funktion erheblich, zumal es einen entsprechenden Bugfix erst mit Version 6.0 geben soll.

Wer in MySQL-Tabellen XML-Daten speichert, wird sich über zwei neue Funktionen freuen: "ExtractValue" wendet einen XPath-Ausdruck auf eine XML-Zeichenkette an und liefert als Ergebnis eine neue Zeichenkette. "UpdateXML" ersetzt innerhalb einer XML-Zeichenkette eine durch einen XPath-Ausdruck ausgewählte Teilzeichenkette durch eine andere. Die beiden XML-Funktionen sind in manchen Fällen durchaus praktisch, machen aus MySQL aber sicherlich noch keine XML-Datenbank.

Was die MySQL-Programmierung betrifft, gibt es für PHP-Entwickler eine interessante Neuerung: Beginnend mit PHP 5.3 kommt die mysqlnd-Bibliothek als neues Backend für die PHP-Extensions mysql, mysqli und wahrscheinlich auch für PDO/mysql zum Einsatz. mysqlnd ersetzt damit die für C-Programmierer konzipierte Bibliothek libmysql. Die von MySQL-Entwicklern erstellte Bibliothek mysqlnd ist nicht nur etwas effizienter als libmysql, sondern lässt sich direkt in den PHP-Code integrieren.

Die mysqlnd-Entwickler haben versprochen, dass sich an der Syntax und Anwendung der PHP-Schnittstellen mysql, mysqli und PDO/mysql durch das neue Backend nichts ändern wird. Ganz stimmt das aber nicht: mysqlnd unterstützt nur das in MySQL 4.1 eingeführte sicherere Authentifizierungsverfahren. Auf manchen Linux-Distributionen kommt dieses Verfahren aber aus Kompatibilitätsgründen bis heute nicht zum Einsatz (old_passwords=1 in my.cnf). Das lässt Login-Probleme beim Umstieg auf PHP 5.3 befürchten, die sich dann nur durch die Neugenerierung aller MySQL-Passwörter beheben lassen.