Kapitel 6: MySQL-Optimierung 325
6.1.2 Portabilit¨at
Weil alle SQL-Server unterschiedliche Teile von SQL implementieren, ist es immer Arbeit,
portable SQL-Applikationen zu schreiben. Bei sehr einfachen Selects und Inserts ist das sehr
einfach, aber je mehr Sie brauchen, desto schwieriger wird es. Wenn Sie eine Applikation
wollen, die bei vielen Datenbanken noch schnell l¨auft, wird es sogar noch schwieriger!
Um eine komplexe Applikation portabel zu machen, m¨ussen Sie sich f¨ur eine Reihe von
SQL-Servern entscheiden, mit denen sie funktionieren soll.
Sie k¨onnen das MySQL-Crash-me-Programm bzw. die Webpage http://www.mysql.com/information/crash-me.php
benutzen, um Funktionen, Typen und Einschr¨ankungen zu finden, die Sie mit einer
Auswahl von Datenbank-Servern benutzen k¨onnen. Crash-me testet bei weitem nicht alles,
was m¨oglich ist, aber mit etwa 450 unterschiedlichen Dingen ist es recht umfassend.
Sie sollten zum Beispiel keine Spaltennamen benutzen, die l¨anger als 10 Zeichen sind, wenn
Sie auch Informix oder DB2 benutzen wollen.
Sowohl die MySQL-Benchmarks als auch die Crash-me-Programme sind sehr
Datenbank-abh¨angig. Indem Sie einen Blick darauf werfen, wie wir damit umgegangen
sind, bekommen Sie ein Gef¨uhl daf¨ur, was Sie in Ihrer Applikation schreiben m¨ussen,
damit diese Datenbank-unabh¨angig l¨auft. Die Benchmark-Tests selbst befinden sich
im ‘sql-bench’-Verzeichnis der MySQL-Quelldistribution. Sie sind in Perl mit der
DBI-Datenbank-Schnittstelle geschrieben (die den Zugriffsteil des Problems l¨ost).
Siehe http://www.mysql.com/information/benchmarks.html wegen der Ergebnisse aus
diesem Benchmark-Test.
Wie Sie an den Ergebnissen sehen, haben alle Datenbanken einige Schwachpunkte, das heißt,
sie haben verschiedene Design-Kompromisse, die zu unterschiedlichem Verhalten f¨uhren.
Wenn Sie nach Datenbank-Unabh¨angigkeit streben, m¨ussen Sie ein gutes Gef¨uhl f¨ur die
Flaschenh¨alse jedes SQL-Servers bekommen. MySQL ist SEHR schnell beim Abrufen und
Aktualisieren von Dingen, hat aber Probleme, wenn gleichzeitig langsame Leser / Schreiber
auf dieselbe Tabelle zugreifen. Oracle hat ein großes Problem, wenn Sie versuchen, auf Zeilen
zuzugreifen, der k¨urzlich aktualisiert wurden (solange, bis sie auf Platte zur¨uckgeschrieben
wurden). Transaktionale Datenbanken sind allgemein nicht sehr gut darin, Zusammenfas-
sungstabellen aus Log-Tabellen zu erzeugen, weil in diesem Fall Sperren auf Zeilenebene
fast nutzlos ist.
Um Ihre Applikation wirklich Datenbank-unabh¨angig zu machen, m¨ussen Sie eine leicht
erweiterbare Schnittstelle definieren, ¨uber die Sie Ihre Daten manipulieren. Weil auf den
meisten Systemen C++ verf¨ugbar ist, ist es sinnvoll, C++-Klassen als Schnittstellen zu den
Datenbanken zu benutzen.
Wenn Sie irgend ein spezifisches Feature einer Datenbankbenutzung (wie den REPLACE-
Befehl in MySQL), sollten Sie eine Methode f¨ur die anderen SQL-Server codieren, um
dasselbe Feature (wenngleich langsamer) zu implementieren. Bei MySQL k¨onnen Sie die /*!
*/-Syntax benutzen, um MySQL-spezifische Schl¨usselw¨orter in einer Anfrage zu verwenden.
Der Code innerhalb von /**/ wird von den meisten anderen SQL-Servern als Kommentar
behandelt (ignoriert).
Wenn WIRKLICH hohe Performance wichtiger als Exaktheit ist, wie bei einigen Web-
Applikationen, besteht eine M¨oglichkeit darin, eine Applikationsebene zu erzeugen, die
Comentarios a estos manuales