Hallo Leute,
Ich habe hier ein mittelgroßes Performanceproblem. Meine Datenbank ist etwa 20 Mbyte groß (MySQL 4) und enthält Zugriffe auf Webseiten.
Wenn ich mir jetzt einen Tag anschauen will, dauert es etwa 1 Minute bis alle Daten geladen sind. Es sind etwa 100 Benutzer am Tag, insgesamt etwa 700 bis 1000 Einträge also. Das ganze mache ich mit JSP, aber ich denke hier bin ich richtiger als im Java-Brett.
Also ich möchte das gerne folgendemassen sortieren:
zuerst nach Nutzernummer und als zweites nach der Zugriffszeit. Ausserdem hole ich mir aus einer anderen Tabelle noch weitere Informationen über die einzelnen Nutzer:
select user
from besucherstatistik
where zeit \>='2005-06-21 0:00:00'
and zeit
Dieses ergibt die oberste Schleife. Sie läuft so oft durch, wie es user gibt. Ich habe es auch schon mit distinct versucht, nutzt nichts.
Dann bekomme ich alle Nutzer des Tages angezeigt. Jetzt laufe ich diese Ergebnisse durch und hole mir jeweils einmal aus einer anderen Tabelle Informationen:
select ip
from besucherinfo
where user=
Und dann hole ich mir als innere Schleife alle Aufrufe des Nutzers
select \*
from besucherstatistik
where zeit \>='2005-06-21 0:00:00'
and zeit
order by zeit
Ich weiss hier nicht mehr so richtig weiter. Im Taskmanager ist die Prozessorauslastung von MySQL enorm hoch, wenn ich so eine Abfrage fahre.
Ich habe mal was gelernt, dass man eine Abfrage als neue temporäre Tabelle benutzen kann. Aber das klappt so nicht. Ich hatte vor, um das Datenvolumen zu verkleinern, dass ich als erstes eine Abfrage mache:
select \*
from besucherstatistik
as temptable
where zeit \>='2005-06-21 0:00:00' and zeit
Und danach nur noch folgende Abfragen mache:
select user
from temptable
group by user
order by user
Das sollte ja dann schneller gehen, weil eben nicht mehr 200.000 Einträge durchsucht werden, sondern nur noch 1000. Aber wie gesagt, das klappt so nicht, da sagt er mir, dass es temptable nicht gibt.
Weiß einer Rat?
danke euch,
der Günther