:: DEVELOPER ZONE
A LEFT JOIN B ist in MySQL wie folgt implementiert:
Die Tabelle B wird als abhängig von Tabelle A und allen
Tabellen, von denen A abhängig ist, gesetzt.
Die Tabelle A wird als abhängig von allen Tabellen (ausser B)
gesetzt, die in der LEFT JOIN-Bedingung aufgeführt sind.
Alle LEFT JOIN-Bedingungen werden zu WHERE-Klausel
verschoben.
Alle Standard-Join-Optimierungen werden durchgeführt, mit der Ausnahme, dass eine Tabelle immer nach allen Tabellen gelesen wird, von denen sie abhängig ist. Wenn es eine zirkuläre Abhängigkeit gibt, gibt MySQL einen Fehler aus.
Alle Standard-WHERE-Optimierungen werden durchgeführt.
Wenn es eine Zeile in A gibt, die mit der WHERE-Klausel
übereinstimmt, aber keine Zeile in B, die mit der LEFT JOIN-Bedingung übereinstimmt, wird eine zusätzliche Zeile für B
erzeugt, deren Spalten alle auf NULL gesetzt sind.
Wenn Sie LEFT JOIN benutzen, um Zeilen zu finden, die in einer
Tabelle nicht existieren, und Sie folgendes im WHERE-Teil angeben:
spalten_name IS NULL, wobei spalten_name eine Spalte ist, die als
NOT NULL deklariert ist, hört MySQL mit der Suche nach weiteren
Zeilen auf (für eine bestimmte Schlüsselkombination), nachdem er eine Zeile
gefunden hat, die mit der LEFT JOIN-Bedingung übereinstimmt.
RIGHT JOIN ist analog zu LEFT JOIN implementiert.
Die Lese-Reihenfolge der Tabellen, die von LEFT JOIN und
STRAIGHT JOIN erzwungen wird, hilft dem Optimierer (der berechnet,
in welcher Reihenfolge die Tabellen verknüpft werden sollen), seine Arbeit
schneller durchzuführen, weil weniger Tabellenvertauschungen überprüft
werden müssen.
Beachten Sie, dass das oben Gesagte bedeutet, dass bei einer Anfrage des folgenden Typs:
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
MySQL einen kompletten Scan von b durchführen wird, weil der
LEFT JOIN erzwingt, dass diese vor d gelesen wird.
Das läßt sich in diesem Fall beheben, indem die Anfrage wie folgt geändert wird:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
© 1995-2005 MySQL AB. All rights reserved.
