MySQL-Query mit Unterabfrage ist langsam
Linda
- datenbank
0 Vinzenz Mai0 Ilja0 Tom
Hallo zusammen,
ich benutze MySQL Datenbank 5.0 (MyISAM) in der Entwicklungsumgebung auf Windows. Die Datenbank ist etwa 500MB groß.
Im Moment versuche ich eine Abfrage zu starten, die meinen ganzen Rechner lahm legt. Die Struktur ist so:
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT column1 FROM t2 ORDER BY column1);
Wobei die Unterabfrage für sich 0.5 Sekunden läuft und 8 Datensätze liefert. Die eigentliche Abfrage wenn auf einen Datensatz modifiziert:
SELECT * FROM t1 WHERE t1.column1 = 1
läuft unter 0.2 Sekunden.
Sobald ich die beiden Abfragen verbinde wird mein Rechner zu 100% von mysql-nt Dienst ausgelastet, sogar in Task Manager komme ich kaum rein um das Prozess zu beenden. Auch nach 10 Minuten ist kein Ergebnis da. Am Query-Tool liegt es nicht. Ich habe es mittlerweile auch in der Konsole probiert.
Können mir SQL-Profis da draußen einen Tip geben, woran es liegen könnte oder wie ich Unterabfragen grundsätzlich performanter gestalten kann?
Gruß, Linda
Hallo Linda
Im Moment versuche ich eine Abfrage zu starten, die meinen ganzen Rechner lahm legt. Die Struktur ist so:
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT column1 FROM t2 ORDER BY column1);
a) Vermeide SELECT *, nutze SELECT <spaltenliste>.
b) Nutze EXPLAIN, um Dir anzeigen zu lassen, was MySQL so lange macht.
c) Hast Du entsprechende Indexe gesetzt?
d) Werden diese genutzt (EXPLAIN)?
e) Hast Du schon einmal einen simplen JOIN mit dem DISTINCT-Schlüsselwort
getestet (und Dir ebenfalls EXPLAIN angeschaut)?
Freundliche Grüße
Vinzenz
yo,
zu dem was Vinzenz gesagt hat würde ich dir noch den tipp geben den alias namen vor den spaltenbezeichnungen zu setzen. die problematik kommt aber wohl aus dem ORDER BY in der unterabfrage, die nicht notwenig ist.
SELECT t1.spalte1, t1.spalte2... FROM t1 WHERE t1.spalte1 IN
(SELECT t2.spalte1 FROM t2);
Ilja
Hello,
ich benutze MySQL Datenbank 5.0 (MyISAM) in der Entwicklungsumgebung auf Windows. Die Datenbank ist etwa 500MB groß.
Im Moment versuche ich eine Abfrage zu starten, die meinen ganzen Rechner lahm legt. Die Struktur ist so:
Die Abfrage alleine legt den Rechner nicht lahm, sondern der dafür benötigte Speicher bei der Größe der DB. 500MB sind schon nicht mehr mit den "Out-of-the-box"-Einstellungen für die Speichernutzung zu handhaben.
Man kann die Grenzen aber nicht alleine an der DB-Größe festmachen, weil es auch von der Anzahl der Datensätze, der Länge der Indexfelder, der Anzahl der Indexe etc. abhängt, wann MySQL mit den Standardeinstellungen einschläft. Außerdem ist es auch wenig sinnvoll, 512MB Speicher zuzuordnen, wenn Dein System nur 264 hat ;-)
Ich habe die (älteren) Beispiele mal unter http://selfhtml.bitworks.de/mysql/config-samples/ abgelegt. Musst Du mal schauen, ob es da ggf. inzwischen neuere gibt in der MySQL-Doku.
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de.