MySQL wieder ein Stückchen grösser
Artikel erschienen in Swiss IT Magazine 2004/20
Gut eineinhalb Jahre hat es gedauert, bis aus der ersten Alpha-Version von MySQL 4.1 eine stabile Datenbanksoftware für den Feldeinsatz wurde. Seit der letzten Oktoberwoche ist es nun soweit: MySQL 4.1.7 steht zum Download bereit.
Wie bei jedem Major-Release sind wieder etliche neue Funktionen hinzugekommen, die langsam, aber sicher die Datenbank aus dem hohen Norden an die Konkurrenz wie PostgreSQL oder Microsofts SQL-Server heranführen. Da wären zum Beispiel Subselects oder kompletter Unicode-Support. Es wurden aber auch etliche bereits vorhandene Funktionen überarbeitet und verbessert wie die Replikation oder die HEAP-Storage-Engine, welche nun Btree-Indizes unterstützt.
Subqueries gehören wie Views zu den von vielen Entwicklern heiss ersehnten Funktionen, da es mit ihnen möglich ist, die Applikationslogik vermehrt auf den Datenbankserver zu verschieben. Während man sich für Views noch bis MySQL 5.0 gedulden muss, findet man in MySQL 4.1 Subqueries (Unter-Abfragen innerhalb einer anderen Abfrage) und Derived Tables («Unnamed views» – Subquery innerhalb der FROM-Clause). Neben einigen MySQL-spezifischen Funktionen wurden sämtliche Operationen implementiert, welche vom SQL-Standard gefordert werden. Mit den Subqueries ist es nun möglich, Operationen, welche früher entweder mit Hilfe einer Programmiersprache oder einem komplexen Konglomerat aus JOINs und UNIONs gelöst wurden, mit einer oder mehreren Subqueries auszuführen, was in den meisten Fällen nicht nur einfacher, sondern auch effektiver ist.
SELECT column1, column2 FROM
table1 WHERE colum3 = (SELECT
MIN(column1) FROM table2);
Diese Operation liess sich bis anhin nicht mit einem JOIN lösen, sondern musste ausprogrammiert werden, indem man zuerst das Resultat der Subquery
SELECT MIN(column1) FROM table2;
angefordert und dieses dann in die eigentliche Query eingesetzt hat:
SELECT column1, column2 FROM
table1 WHERE colum3 = '4';
Neben den klassischen Subqueries ermöglicht MySQL nun auch Subqueries in den FROM-Clauses, was man auch als Derived Tables oder Unnamed Views bezeichnet. Damit ist es zum Beispiel möglich, Operationen auf vorher ermittelte Resultate auszuführen. Wenn man beispielsweise Summen bildet und von diesen nachher den Durchschnitt ermitteln möchte, war das mit älteren Versionen als MySQL 4.1 nicht in einem Rutsch zu erledigen:
SELECT AVG(SUM(column1)) FROM
table1 GROUP BY column1;
Dies lässt sich nun mit einem Unnamed View realisieren:
SELECT AVG(sum) FROM (SELECT
SUM(table1.column1) AS sum FROM
table1 GROUP BY table1.column1)
AS table1;
MySQL 4.1 unterstützt als erste MySQL-Version die Verwendung von serverseitigen Prepared Statements, welche die Ausführungsgeschwindigkeit bei vielen ähnlichen Operationen erhöhen und gegen SQL Injection schützen können.
Prepared Statements erlauben, das Grundgerüst einer SQL-Query auf dem Server abzulegen und diese dann mehrfach mit unterschiedlichen Daten zu benutzen. Ein Prepared Statement könnte so aussehen:
SELECT field FROM table WHERE
name = ?;
Das Fragezeichen (?) stellt dabei den Platzhalter dar, der bei jeder Verwendung mit einem anderen Wert vertauscht werden kann.
PREPARE beispiel_stmt FROM
'SELECT field FROM table WHERE
name = ?';
SET @a = 'Andreas';
EXECTUE beispiel_stmt USING @a;
Prepared Statements können mit den Funktionen INSERT, REPLACE, UPDATE, DELETE, CREATE TABLE IF NOT EXISTS sowie SELECT verwendet werden. Andere Funktionen sollen mit den nächsten Versionen folgen.
Ihre Nutzung lohnt sich insbesondere dann, wenn komplexere Queries (JOINs…) mehrfach verwendet werden. Dies, da der Query Optimizer nur einmal die Abfrage analysieren und optimieren muss. Ändern sich die Abfragedaten, werden diese nur an die Stelle der Platzhalter gesetzt, eine nochmalige Analyse der Abfrage ist nicht nötig, womit sich Rechenzeit sparen lässt. Ein weiterer Vorteil ist, dass die Daten, welche an die Stelle der Platzhalter gesetzt werden, nicht maskiert werden müssen, womit sich der SQL Injection vorbeugen lässt.
Prepared Statements können mit PHP ab der Version 5 mit der passenden Extension ext/mysqli verwendet werden. Perl- oder Java-Entwickler können bereits seit einiger Zeit auf Prepared Statements zurückgreifen, allerdings sind diese nur auf der Client-Seite implementiert. Java-Entwickler können mit MySQL Connector/J in der Version 3.1 nun auch serverseitige Prepared Statements nutzen, ohne ihren Quellcode verändern zu müssen. Gleiches gilt für .Net mit dem MySQL Connector/Net 1.0. Für Perl-Entwickler sind die Nachrichten noch nicht ganz so positiv: Sie müssen noch auf eine neue Version von DBD::mysql warten.
Abgesehen von den SQL-Erweiterungen wie den eben besprochenen Subqueries wurde MySQL mit den Möglichkeiten ausgestattet, weitere Datentypen zu speichern. So wurde die Unterstützung für Multibyte-Zeichensätze integriert, womit sich Daten in allen möglichen Sprachen abspeichern lassen. Dies ist insbesondere für Applikationen wichtig, die auf ein internationales Publikum ausgerichtet sind. Zwar konnte man auch bisher Multibyte-Daten in MySQL-Datenbanken abspeichern, allerdings war es dann unmöglich, MySQLs interne Sortieralgorithmen auf Resultsets anzuwenden.
Die Kontrolle über die verwendeten Zeichensätze ist auf mehreren Ebenen implementiert. So lassen sich die Zeichensätze auf Datenbank, Tabellen- und Spaltenebene einstellen. Damit ist es möglich, IDs, die vor allem innerhalb einer Applikation zur Verarbeitung der Daten verwendet werden, weiterhin als 7- oder 8-Bit-Zeichen zu behandeln, während Texte, welche nach aussen transportiert werden, mit einem Multibyte-Zeichensatz abgespeichert werden. Implementiert sind sowohl UTF8 als auch UCS2. Zudem ist es nun bei der Verbindung mit dem Server möglich, die eigene Zeitzone zu setzen, womit sich Zeitangaben in die jeweilige Zeitzone konvertieren lassen.
Dass man bei MySQL noch weitere Ambitionen hat, als die Datenbank der Wahl für zahllose Webapplikation zu sein, zeigt die Implementierung von GIS (Geographic Information System) und Spatial Extensions in die MyISAM-Storage-Engine. Diese ermöglichen das Abspeichern und Indizieren von geographischen und geometrischen Daten in einer effizienten Weise, so dass sich diese Daten mit einem minimalen Overhead auch zum Berechnen von geographischen Abständen nutzen lassen. Auch meteorologische Daten sollen sich speichern lassen können. Als Vorlage hat man sich bei MySQL der OpenGIS-Spezifikation bedient. Allerdings ist die Implementierung der OpenGIS-Spezifikation noch nicht komplett. So wurden unter anderem einige Funktionen wie Union() oder die GIS-Metadaten-Tabellen weggelassen.
Ein weiteres Indiz, dass man im Enterprise-Bereich weiter nach oben krabbelt, ist die Realisierung einer Clustering-Engine. Die NDB Storage Engine, welche ursprünglich von Ericsson entwickelt wurde, hat man bereits im April dieses Jahres vorgestellt. Sie wird nun im Rahmen von MySQL 4.1 mitausgeliefert und ermöglicht In-Memory-Datenbankclustering mit Standardhardware.
Nach MySQL 4.1 steht die Entwicklung der Version 5 auf dem Marschplan der Entwickler. Erste Alpha-Versionen sind bereits seit Weihnachten 2003 zum Download verfügbar. Zu den geplanten Neuerungen gehören unter anderem heiss ersehnte Funktionen wie Views oder Stored Procedures (nach SQL 2003). Zudem soll ein grundlegender Support für Cursors sowie Rtree-Indices für MyISAM hinzukommen.
Unterstützung von Subqueries und Derived Tables/Unnamed Views
beschleunigtes Client-/Server-Protokoll auf Binär-Basis
Replikation durch SSL-Tunnels
Prepared Statements und Parameter-Binding
Chained Queries
Btree-Indices für HEAP-Storage-Engine
OpenGIS-Support in MyISAM-Storage-Engine
Unterstützung von Multibyte-Zeichensätzen (UTF8, UCS2)
CREATE TABLE IF NOT EXISTS table2 LIKE table1 erlaubt die Erzeugung einer Tabelle mit einer identischen Struktur
INSERT … ON DUPLICATE KEY UPDATE … erlaubt die Aktualisierung eines Datensatzes, wenn ein INSERT wegen eines Index-Fehlers (Duplikat) fehlschlägt
Mit MySQL Administrator und MySQL Query Browser stehen zwei grafische Tools für die Arbeit mit MySQL bereit.
Administrator erlaubt, fast die komplette Administration der Datenbank vom Desktop aus zu erledigen. Zudem verfügt er über etliche Monitoring-Funktionen, mit denen sich unter anderem die Anbindung, der Datentransfer und die Anzahl von aktiven SQL-Queries verfolgen lassen. Ebenso kann man zentral die Replikationsaktivitäten überwachen, was besonders praktisch ist, wenn man einen grösseren Cluster unter seinen Fittichen hat. Last but not least können Backup-Prozesse angelegt und zeitgesteuert ausgeführt werden.
Query Browser ist ein Tool, mit dessen Hilfe sich Queries zusammenklicken und analysieren lassen. Auch kann man unterschiedliche Queries miteinander auf Basis des zurückgegebenen Result-Sets vergleichen sowie Transaktionen starten und deren Aktionen verfolgen.