phpbar.de logo

Mailinglisten-Archive

[php] Sessionsauswertung mit mysql und having-clause

[php] Sessionsauswertung mit mysql und having-clause

Dennis Breithaupt php_(at)_phpcenter.de
Thu, 04 Jul 2002 14:52:51 +0200


Hallo Leute,

eine sessionbasierte Website, die ich betreue, schreibt bei jedem Aufruf
der Hauptseite einen logeintrag in eine tabelle u.a. mit den spalten 'sid'
für die session_id und 'time' für die zugriffszeit.

Mit folgender Query mache ich nun eine Auswertung, um zu erfahren, wie
lange eine Session gedauert hat und wieviele Zugriffe sie erzeugt hat:

select sid, count(sid), min(time) as first_access, max(time) as last_access
from web_log
where date_add(time, INTERVAL 2 DAY) > now()
group by sid
having date_add(last_access, INTERVAL 1 DAY) > now()
order by last_access desc

Man beachte die where und die having-clause.

Die having-clause sorgt dafür, dass ich nur sessions angezeigt bekomme, die
in den letzten 24 Stunden noch einen Zugriff hatten. Würde ich dieses
Kriterium direkt in der where-clause einbauen, könnten sessions
zerschnitten werden, die vor 24 Stunden begonnen, aber noch innerhalb 24
Stunden fortgeführt wurden.

Die where-clause habe ich dann noch eingebaut um bei einer grossen Tabelle
dem Optimizer von mysql noch etwas entgegenzukommen. Ich erachte es als
höchst unwahrscheinlich, dass eine Session länger als 24 Stunden dauert und
schneide deshalb mit der where-condition zumindest gleich alles weg, was
älter als 2 Tage ist.

Meine Fragen sind nun folgende:
Sind diese überlegungen logisch und richtig?
Bringt das Vorsortieren mit WHEREhier überhaupt etwas bei grossen tabellen?
Gibt es eine Möglichkeit, das ganze auch eleganter möglicherweise ohne
HAVING zu lösen?
Wie müssen bei dieser Tabelle die Indizes gesetzt werden, um optimale
Performance zu erreichen? Selbst bei einem Index auf sid und time behauptet
EXPLAIN, er würde keinen Index benutzen.

Vielen Dank für eure Statements, mfG

Dennis Breithaupt


php::bar PHP Wiki   -   Listenarchive