Halihallo Harry
while (@hitdata = $hits->fetchrow_array)
{
Visitgrenze feststellen....
}
Du arbeitest also mit Perl. Ich hielte dies noch für
erwähnungswürdig, zumal die Aussage, dass die Datenbank am Timeout
Schuld ist nicht zwingend richtig sein muss...
Mein Rechner hat nur 512MB. Der rödelt da stundenlang rum und sollte, wenn fertig, die Ergebnisse in einer anderen Tabelle speichern. Aber mittendrin bricht er ab. Ich weiß aber nicht, ob es einen Timeout gegeben hat oder der Speicher nicht reicht (die Platte hat noch genug Reserven!).
Dann würde ich - oder besser: eigentlich immer - eine
Fehlerbehandlung in das Programm integrieren.
Nun bin ich hingegangen und habe das so umgebaut, daß ich mit limit arbeite, d.h. "limit $a, 10000" anwende und in einer Schleife die Funktion mit Parameter für $a aufrufe. Die Schleife erhöht $a dann immer um 10000.
Du bekämpfst die Symptome, nicht aber die Krankheit; wenn mir diese
kleine Analogie gestattet ist.
Die Frage ist, ob es nicht anders geht, d.h. ob ich in der my.cnf irgendwas drehen muß/kann, was dann eine Berechnung ohne limit ermöglicht.
In Perl:
my $sth = $dbh->prepare("SELECT ...", { 'mysql_use_result' => 1} );
Dann werden die Daten auf dem Server gehalten und müssen explizit
der Reihe nach über fetchrow_* eingelesen werden.
Der Vorteil: Die Daten werden nicht im RAM gecached, bzw. wenn sie
gecached werden, dann auf dem Server (MySQL-Server) und dieser
Versteht es, wie man dies am einfachsten, effizientesten und
speicherschonensten ablegt.
Der Nachteil: Oftmals werden dadurch andere Prozesse geblockt
und/oder ausgebremst.
Viele Grüsse
Philipp