[PHP] ca. 90 000 Datensätze verarbeiten

06/27/2014 15:46 Serraniel#1
Moin,

ich hab mir nen SQL Query gebastelt womit ich ne Statistik anlegen will und grafisch darstellen will über Aufrufe in den letzten 24 Stunden. PHP gecoded ist alles soweit, nur scheint es so, als ob PHP nicht mit der Menge der Datensätze klar kommt und irgendwann einfach sagt: Ne ist nicht, ich gib dir nen 500er zurück.

Gibts da vielleicht ne alternative das Result meiner Query zu verarbeiten?
Aktuell:
PHP Code:
$db = @new mysqli($server$user$pass$database);
if(
mysqli_connect_errno() == 0)
{
     
$sql "STATEMENT";
     
$result $db->query($sql);
     while(
$line $result->fetch_object())
     {
          
//Code
     
}

So im groben. Auf mehrere Querys aufteilen hab ich auch schon probiert, dann kam oft, nicht immer, ein Timeout leider.

hab mal künstlich die Datensätze reduziert dann gings, also liegt wohl an der Menge.
Jemand eine Idee (außer vllt mehr Speicher)?
06/27/2014 16:36 Else#2
Kleiner Hinweis am Rande: Dein Impressum ist unvollständig. Es muss eine postalische Anschrift angegeben werden! Du solltest das korrigieren, nicht das anders wertig einmal kontaktiert wirst.
06/27/2014 16:59 Mikesch01#3
Was genau willst du denn auslesen aus deiner Datenbank? So viele Werte brauchst du doch gar nicht.

Du kannst auch Werte kummulieren: z.B
Code:
SELECT SUM(TortenProNutzer) AS gesamtTorten, COUNT(userID) AS gesamtNutzer FROM ...
06/30/2014 12:09 VisionEP1#4
php ini timeouts hochsetzen(u.a. max execution time)
06/30/2014 15:38 Kentika#5
Cachen + Cronjob welcher dann alle 12 Stunden oder sowas läuft.
07/01/2014 14:51 mhaendler#6
Du solltest das ganze nicht über den Browser ausführen sondern eine über CLI "Command Line Interface", dadurch erhältst du keinen 500er. Ansonsten:

Ruf das Script auf mit den Parametern (LIMIT 0 OFFSET 0), und übergebe dann LIMIT und OFFSET einfach wieder an das Script (es soll sich selbst aufrufen nach dem verarbeiten)

Dadurch machst du halt immer wieder 200 Datensätze, bis du die 90000 voll hast
07/01/2014 18:14 Serraniel#7
Danke, werde die Sachen am Wochenende mal testen, da hab ich zeit dafür.
07/03/2014 01:51 Th3dan#8
Für mich klingt das stark danach, als ob deine Abfrage ineffizient ist und du relativ viel Last auf PHP anstatt auf die DB ist. Das ist schlecht, da inperformanter. 90k Datensätze sind nicht viel, da sollte es eigentlich keine Probleme geben. Erstelle selbst für eigene Projekte Statistiken aus über 300k Datensätzen. Die Abfrage braucht dann natürlich ein paar Sekunden um komplett durchzulaufen, das ist klar. Aber so lange das serverseitig was kaputt geht auf keinen Fall.

Die geposteten Vorschläge halte ich nicht für sinnvoll, da sie nicht das eigentliche Problem lösen sondern nur an den Symptomen rumdoktorn. Um genaueres sagen zu können müsste man natürlich deine Abfrage und DbStruktur kennen. Vielleicht fehlen auch Indizes oder es sind welche vorhanden von denen die Abfrage nicht profitiert weil sie schlecht geschrieben ist.

Oder frägst du etwa ALLE 90k Datensätze ab und bastelst daraus Stats zusammen? Das würde natürlich alles erklären.
07/03/2014 15:24 Serraniel#9
Quote:
Originally Posted by Th3dan View Post
Oder frägst du etwa ALLE 90k Datensätze ab und bastelst daraus Stats zusammen? Das würde natürlich alles erklären.
Ja. Ich will ne 24 Stundne statistik, also hol ich mir aus den logs alle logdatensätze der letzten 24 studnen.
Danach geh ich jeden Datensatz durch und guck in weloche stunde er "passt" (0-23 der letzten 24) und inkrementiere entsprechend nen array.

vorher hatte ich für jede der 24 stundne eine einzelne abfrage wo ich die COUNT(id) hatte. Sprich 24 mal diese abfrage. Und dabei entstand irgendwann nen timeout.
Jedne datensatz einzeln durchzugehen war dann jetzt ein neuer versuch, auch wenn mir klar war das das wahrscheinlich noch weniger was wird. xD
07/03/2014 17:07 マルセル#10
Das sollte passen, wenn ich jetzt nicht falsch gelesen habe, bin müde :-D

PHP Code:
SELECT FROM table WHERE timeRow DATE_SUB(NOW(), INTERVAL 1 DAY
Dann mach das lieber so, anstatt alles auszulesen und es hinterher mit PHP zu verarbeiten, das wäre eine zu große Last.