Mailinglisten-Archive |
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