336 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
Tabellen sollten ¨ublicherweise mit Indexen gemacht werden. Sie k¨onnen den EXPLAIN-
Befehl benutzen, um herauszufinden, welche Indexe f¨ur ein SELECT benutzt werden. Siehe
Abschnitt 6.2.1 [EXPLAIN], Seite 329.
Einige allgemeine Tipps:
• Um MySQL zu helfen, Anfragen besser zu optimieren, lassen Sie myisamchk --analyze
auf eine Tabelle laufen, nachdem sie mit relevanten Daten gef¨ullt wurde. Das aktu-
alisiert einen Wert f¨ur jeden Index-Teil, der die durchschnittliche Anzahl von Zeilen
angibt, die denselben Wert haben. (Bei eindeutigen Indexen ist das nat¨urlich im-
mer 1). MySQL benutzt diesen Wert, um zu entscheiden, welcher Index benutzt wer-
den soll, wenn Sie zwei Tabellen mit einem ’nicht konstanten Ausdruck’ verbinden.
Sie k¨onnen das Ergebnis nach dem Laufenlassen von analyze mit SHOW INDEX FROM
tabelle ¨uberpr¨ufen und die Cardinality-Spalte untersuchen.
• Um einen Index und Daten gem¨aß einem Index zu sortieren, benutzen Sie myisamchk
--sort-index --sort-records=1 (wenn Sie nach Index 1 sortieren wollen). Wenn Sie
einen eindeutigen Index haben, von dem Sie alle Datens¨atze gem¨aß der Reihenfolge
dieses Indexes lesen wollen, ist das eine gute Art, das schneller zu machen. Beachten
Sie jedoch, dieses Sortieren nicht optimal geschrieben wird und bei einer großen Tabelle
lange dauert!
6.2.4 Wie MySQL WHERE-Klauseln optimiert
Die WHERE-Optimierungen wurden hier in den SELECT-Teil aufgenommen, weil sie meist in
Verbindung mit SELECT benutzt werden, aber dieselben Optimierungen treffen f¨ur WHERE
bei DELETE- und UPDATE-Statements zu.
Beachten Sie auch, dass dieser Abschnitt nicht vollst¨andig ist. MySQL f¨uhrt viele Opti-
mierungen durch und wir hatten noch keine Zeit, alle davon zu dokumentieren.
Einige der Optimierungen, die MySQL durchf¨uhrt, sind unten aufgef¨uhrt:
• Entfernung unn¨otiger Klammern:
((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
• Konstanten-’Falten’ (Folding):
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
• Bedingungsentfernung bei Konstanten (notwendig wegen Konstanten-’Falten’):
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
• Konstante Ausdr¨ucke, die von Indexen benutzt werden, werden nur einmal ausgewertet.
• COUNT(*) auf eine einzelne Tabelle ohne ein WHERE wird direkt aus der Tabelleninfor-
mation a/jointfilesconvert/293675/bgerufen. Das wird auch bei jeglichen NOT NULL-Ausdr¨ucken gemacht, wenn
diese nur f¨ur eine Tabelle benutzt werden.
• Fr¨uherkennung ung¨ultiger Konstanten-Ausdr¨ucke. MySQL stellt schnell fest, dass
einige SELECT-Statements unm¨oglich sind, und gibt keine Zeilen zur¨uck.
• HAVING wird mit WHERE vereinigt, wenn Sie GROUP BY oder Gruppen-Funktionen
(COUNT(), MIN() usw.) nicht benutzen.
Comentarios a estos manuales