
334 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
table type possible_keys key key_len ref rows Extra
et ALL PRIMARY NULL NULL NULL 74
do ALL PRIMARY NULL NULL NULL 2135
et_1 ALL PRIMARY NULL NULL NULL 74
tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872
range checked for each record (key map: 35)
Weil type bei jeder Tabelle ALL ist, zeigt die Ausgabe, dass MySQL eine komplette
Verkn¨upfung (Full Join) aller Tabellen durchf¨uhrt! Das dauert recht lange, weil das
Produkt der Zeilenanzahl in jeder Tabelle untersucht werden muss! In diesem Fall ist das
74 * 2.135 * 74 * 3.872 = 45.268.558.720 Zeilen. Wenn die Tabellen gr¨oßer w¨aren,
k¨onnen Sie sich vorstellen, wie lange das dauern w¨urde.
Ein Problem liegt hier darin, dass MySQL (noch) keine Indexe auf Spalten effizient benutzen
kann, wenn sie unterschiedlich deklariert sind. In diesem Zusammenhang sind VARCHAR
und CHAR dasselbe, es sei denn, sie sind mit unterschiedlichen L¨angen deklariert. Weil
tt.ActualPC als CHAR(10) und et.EMPLOYID als CHAR(15) deklariert ist, gibt eine Unstim-
migkeit der L¨angen.
Um diese Ungleichheit der Spaltenl¨angen zu beheben, benutzen Sie ALTER TABLE, um
ActualPC von 10 auf 15 Zeichen zu verl¨angern:
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
Jetzt sind tt.ActualPC und et.EMPLOYID beide VARCHAR(15). Eine erneute Ausf¨uhrung
des EXPLAIN-Statements ergibt dieses Ergebnis:
table type possible_keys key key_len rew rows Extra
tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used
do ALL PRIMARY NULL NULL NULL 2135
range checked for each record (key map: 1)
et_1 ALL PRIMARY NULL NULL NULL 74
range checked for each record (key map: 1)
et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1
Das ist nicht perfekt, aber viel besser (das Produkt der rows-Werte ist jetzt um einen Faktor
74 niedriger). Diese Version wird innerhalb von ein paar Sekunden ausgef¨uhrt.
Eine zweite
¨
Anderung kann durchgef¨uhrt werden, um die Unstimmigkeit der Spaltenl¨angen
f¨ur die tt.AssignedPC = et_1.EMPLOYID- und tt.ClientID = do.CUSTNMBR-Vergleiche zu
beheben:
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
MODIFY ClientID VARCHAR(15);
Jetzt ergibt EXPLAIN folgende Ausgabe:
table type possible_keys key key_len rew rows Extra
et ALL PRIMARY NULL NULL NULL 74
tt rew AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used
et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1
do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1
Das ist fast so gut, wie es ¨uberhaupt geht.
Das verbleibende Problem besteht darin, dass MySQL vorgabem¨aßig annimmt, dass die
Werte in der tt.ActualPC-Spalte gleichm¨aßig verteilt sind, was in der tt-Tabelle nicht der
Fall ist. Gl¨ucklicherweise ist es einfach, MySQL dar¨uber zu informieren:
Comentarios a estos manuales