MySQL Performance bei INNER Join vs. OUTER Join

Bei der Universenerstellung mit Business Object kam neulich die Frage nach dem Performancetuning auf, speziell in Bezug auf die verwendeten Joins. Zitat meines BO-erfahrenen Kollegen war: „Die Datenbank freut sich jedes Mal, wenn sie einen INNER Join statt OUTER Join machen darf.“.  Eine Google-Suche zu dem Thema ergab wenig quantifizierbare, valide Ergebnisse, also habe ich zuhause eine eigene Testreihe gestartet.

Mein Setup:

  • MySQL 5.4.2 Beta
  • Employees Datenbank, mit vervielfachter employees-Tabelle auf 10 Millionen Datensätze

Als Testabfrage dient ein Self-Join der Tabelle employees, der für OUTER und INNER Joins jeweils an fett gedruckter Stelle angepasst wird:

SELECT o.first_name, i.last_name
FROM employees o
{LEFT OUTER | INNER} JOIN employees i ON o.emp_no = i.emp_no
WHERE o.last_name =  'Sichman';

Die WHERE Klausel ist lediglich eingebaut, um die Ergebnismenge zu verkleinern. Als Ergebnis zeigt sich, dass der INNER Join in diesem Fall deutlich schneller ist (Durchschnittswerte nach 10 Iterationen mit FLUSH Statements, Angaben in Sekunden):

Jointyp Zeit in Sekunden
INNER JOIN 4.20
OUTER JOIN 12.17

By the way: Der Teufel steckt hier wie auch in obigem Business Objects Fall im Detail. Zeigt die WHERE Klausel auf die i-Tabelle, wird der Vorteil des INNER Join gegenüber dem OUTER Join dadurch zunichte gemacht – beide Anfragen haben fast identische Laufzeiten von über einer Minute.

Advertisements

Neuigkeiten in MySQL 5.4

Die Halbwertzeit von MySQL 5.1 als neueste Version der Open-Source-Datenbank war gering. Schon im April 2009, wenige Monate nach dem Produktivrelease von MySQL 5.1 (5.1.30 GA), kam die erste 5.4 Beta (5.4.0 Beta). Verantwortlich dafür war Internetgigant Google, der eigenentwickelte Patches in den offiziellen Entwicklungszweig übergab. Doch was haben diese Patches für den Normal-Anwender für nennenswerte Vorteile?

Das ChangeLog unter dev.mysql.com liest sich als Sammlung technischer Tuningmaßnahmen. Vorteile gibt es in folgenden Bereichen:
– Skalierbarkeit für Mehrkernprozessoren (Symmetric MultiProcessors), was bei steigender Anzahl paralleler Verbindungen schlagend wird
– Tuning der InnoDB Storage Engine durch Rekonfiguration
– Integration des InnoDB Plugins als Ersatz für die fest eingebaute Storage Engine
– Unterstützung von Pluggable Storage Engines unter Windows
– Stabilitäts- und Performancefixes im Rahmen der Replikation und Partitionierung
– Subquery und Join Optimierung
– Implementierung von SIGNAL und RESIGNAL (Dokumentation mittlerweile wieder entfernt)

MySQL 5.4 befindet sich zum Zeitpunkt dieses Posts (Oktober 2009) noch in der Betaphase. MySQL liegt in der Version 5.1.39 als produktives Releas vor. Bislang sind keine weiteren „Abweichungen“ von der ursprünglichen Roadmap dokumentiert.

PHP 5.3 und MySQL 5.1 als Online-Buch

Ab dem 19.Oktober 2009 wird es die Produktpalette des Verlages Galileo Press als Online-Buch geben. Mit dabei ist unser „PHP 5.3 und MySQL 5.1“. Die Bücher können dann von jeden onlinefähigen Computer gelesen werden. Technisch vergleichbar ist dies etwa mit Google Books. D.h. die Bücher werden nicht als PDF Version verteilt, sondern sind nach Anmelde-, Einlog- und Kaufprozess am Bildschirm zu betrachten.

Das Angebot sieht vor, Bücher alternativ online oder zusätzlich zur gedruckten Version zu kaufen – in entsprechend angepasstem Preismodell. Die in einer gedruckten Version vorhandene Registriernummer bietet dem Leser unabhängig davon eine Woche lang den Vorteil, auch die Onlineversion zu testen. Weitere Informationen und die Möglichkeit, das Angebot wahrzunehmen, finden sich unter http://booksonline.galileo-press.de.