Kapitel 6: MySQL-Optimierung 339
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¨upft wer-
den sollen), seine Arb eit schneller durchzuf¨uhren, weil weniger Tabellenvertauschungen
¨uberpr ¨uft werden m¨ussen.
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¨uhren wird, weil der LEFT JOIN erzwingt, dass
diese vor d gelesen wird.
Das l¨aßt sich in diesem Fall beheben, indem die Anfrage wie folgt ge¨andert 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
6.2.7 Wie MySQL LIMIT optimiert
In einigen F¨allen handhabt MySQL die Anfrage unterschiedlich, wenn Sie LIMIT # statt
HAVING benutzen:
• Wenn Sie nur einige wenige Zeilen mit LIMIT ausw¨ahlen, benutzt MySQL in eini-
gen F¨allen Indexe, wenn er ansonsten vorzugsweise einen vollst¨andigen Tabellenscan
durchf¨uhren w¨urde.
• Wenn Sie LIMIT # mit ORDER BY benutzen, beendet MySQL das Sortieren, sobald er
die ersten # Zeilen gefunden hat, anstatt die gesamte Tabelle zu sortieren.
• Wenn Sie LIMIT # mit DISTINCT kombinieren, h¨ort MySQL auf, sobald er # eindeutige
Zeilen gefunden hat.
• In einigen F¨allen kann GROUP BY aufgel¨ost werden, indem der Schl¨ussel in der Reihen-
folge gelesen wird (oder der Schl¨ussel sortiert wird) und danach Zusammenfassungen
berechnet werden, bis sich der Schl¨usselwert ¨andert. In diesem Fall berechnet LIMIT #
keine unn¨otigen GROUP BY’s.
• Sobald MySQL die ersten # Zeilen an den Client geschickt hat, wird die Anfrage a/jointfilesconvert/293675/bge-
brochen.
• LIMIT 0 gibt immer schnell eine leere Ergebnismenge (empty set) zur¨uck. Das ist
n¨utzlich, um die Anfrage zu ¨uberpr¨ufen und die Spaltentypen der Ergebnisspalten zu
erhalten.
• Die Gr¨oße der tempor¨aren Tabellen benutzt LIMIT #, um zu berechnen, wieviel Platz
ben¨otigt wird, um die Anfrage aufzul¨osen.
6.2.8 Geschwindigkeit von INSERT-Anfragen
Die Zeit, einen Datensatz einzuf¨ugen, besteht ungef¨ahr aus:
• Verbindung: (3)
• Anfrage an den Server schicken: (2)
• Anfrage parsen: (2)
• Datensatz einf¨ugen: (1 x Gr¨oße des Datensatzes)
• Indexe einf¨ugen: (1 x Anzahl der Indexe)
Comentarios a estos manuales