Performance Problem for Schleife + SELECT

dobermant

Erfahrenes Mitglied
Guten Tag,

Um Logstatistiken auszuwerten, speichere ich jeden Zugriff auf die Website in einer SQL Tabelle
PHP:
$sql = "INSERT INTO table_log (timestamp) VALUES ('$time')";
$result = mysql_query($sql, conn);

Jetzt möchte ich diese Daten auslesen um z.B. Diagramme zu erstellen.
Als Beispiel sollen die täglichen Zugriffe der letzten 30 Tage ausgegeben werden.

Dazu lese ich innerhalb einer Schleife die Zugriffe des jeweiligen Tages aus.
Das sieht dann ungefähr so aus(ungeprüft, soll nur dem Verständniss diesen)
PHP:
$day_sec = 3600*24 ;
while ($i<31) { 
   $k++;$i++;
   $timetemp = $timestart - $day_sec;
   $sql  = "SELECT id FROM gc_log WHERE zeit < '$timestart' and zeit > '$timetemp' ";
   $result = mysql_query($sql, $conn);
   $data[$k] = mysql_num_rows($result);
   $stunde[$k] = date("d",$timestart);
   $timestart= $timetemp;
}
Dummerweise dauert das viel zu lange(5-10 sek), es liegen 200 000 oder mehr Datensätze vor und in diesem Falle wären das 31 SELECT`s.

Kann ich das noch irgendwie optimieren, oder sollte ich die SQL Tabelle gleich anders anlegen? Z.b. für jeden Monat eine extra Table erstellen um so die Tables kleiner zu halten.

Vielen Dank für Eure Hilfe

Mike
 
Zuletzt bearbeitet:
Da $i innerhalb der Schleife nicht verändert wird, wird die Schleife entweder keinmal oder bis zum Abbruch des Skripts wegen Zeitüberschreitung immer wieder durchlaufen.

Des weiteren reicht auch nur eine Datenbankabfrage:
PHP:
"SELECT id FROM gc_log WHERE zeit BETWEEN ".($timestart-31*86400)." AND ".$timestart;
 
...fehlte das $i++; ok, aber wie gesagt, nur zur Veranschaulichung, hab den Code nicht hier im Büro..

Danke schonmal...
 
Sehe ich das richtig dass du für jeden Zugriff einen neuen Datensatz anlegst?
Ich würde eher für jeden Tag einen Datensatz anlegen. Dort speicherst du das Datum und einen Int-Wert der dann immer eins hochgezählt wird wenn wer auf deine Website kommt (UPDATE...)
Dann kannst du deine Statistik mit nur einem SELECT erstellen. (ORDER BY und LIMIT...)
 
Sehe ich das richtig dass du für jeden Zugriff einen neuen Datensatz anlegst?
Ich würde eher für jeden Tag einen Datensatz anlegen. Dort speicherst du das Datum und einen Int-Wert der dann immer eins hochgezählt wird wenn wer auf deine Website kommt (UPDATE...)
Dann kannst du deine Statistik mit nur einem SELECT erstellen. (ORDER BY und LIMIT...)

Dann würde ich aber auf Stunden Statistiken verzichten müssen :-(
Oder habe ich Dich falsch verstanden?

gruss Mike
 
Stimmt und du hast mich richtig verstanden :)

Nicht desto Trotz wäre das eine Alternative um schnelle Monatsstatistiken zu bekommen.
Da ich aber mehrere Domains logge(50) müsste ich also für jede Domain einen extra Tageintrag machen? nach dem Motto:

domain1.com 1
domain2.com 1
............
............
domain1.com 31
domain2.com 31

Danke!
 
ps thema erledigt, danke

PHP:
SELECT COUNT( * ) AS NUM, DAY( FROM_UNIXTIME( `zeit` ) ) AS tag
FROM `gc_log`
WHERE MONTH( FROM_UNIXTIME( `zeit` ) ) =3
AND YEAR( FROM_UNIXTIME( `zeit` ) ) =2008
GROUP BY DAY( FROM_UNIXTIME( `zeit` ) )
 
Zurück