PHP Blätterfunktion bei 4140000 Einträgen

maddin-x2

Grünschnabel
Hallo liebe Forengemeinde,

ich habe ein kleines Problem mit meiner Blätterfunktion in PHP. Das Problem ist, dass es ewig dauert bis die Seiten aufgebaut werden. Das wird wohl an der enomen Größe der Datenbank liegen, die dort durchforstet wird.
Hat jemand vielleicht wie ich es umgehen kann, dass die Laufzeit so hoch ist?

Hier mal der Code den ich verwendet habe:

PHP:
$sql = 'SELECT count(*) FROM traffic';
if (!$stmt = $db->prepare($sql)) {
    die('MySQL-Fehler: '.$db->error);
}
$stmt = $db->query($sql);
if (!$stmt) {
    die('MySQL-Fehler: '.$db->error);
}
$row = $stmt->fetch_assoc();
$anzahl_daten = $row['count(*)'];
$stmt->close();

$a['seiten'] = ceil($anzahl_daten / $eintraege_seite);
if (empty($_GET['seite'])) {
    $the_start = 0;
} else {
    $the_start = $_GET['seite'] * $eintraege_seite - $eintraege_seite;
}
$sql = 'SELECT
    host,
    datetime,
    msg,
    seq
FROM
    traffic
ORDER BY
    seq ASC
LIMIT
    ? , ?';
$stmt = $db->prepare($sql);
if (!$stmt) {
    return $db->error;
}
$stmt->bind_param('ii', $the_start, $eintraege_seite);
if (!$stmt->execute())  {
    return $stmt->error;
}
$stmt->bind_result($host, $datetime, $msg, $seq);
while ($stmt->fetch()) {
    $a['data'][$seq]['host'] = $host;
    $a['data'][$seq]['datetime'] = strtotime($datetime);
    $a['data'][$seq]['msg'] = explode(" ", $msg);
}
 
Ja das sind nicht wenige und da kommen täglich jede Menge dazu :(
Zuerst habe ich daran gedacht, dass der Server vielleicht zu klein ist, bzw. die Rechenleistung nicht ausreicht, aber wenn ich über phpmyadmin mir die Tabelle anschaue und blättere geht das ja auch ganz fix.

Mit dem unterteilen habe ich mir auch schon überlegt, aber da mir das dann zu komplex wird, gerade in Bezug auf den Syslog der die Datenbank befüllt, habe ich diese Idee wieder verworfen.
 
Hi,

hast Du einen Index auf der Spalte "seq"?
Hast Du in Deinem Script schon mal getestet, an welcher Stelle genau der Flaschenhals ist?

LG
 
Ja, ich denke das der Flaschenhals am Count Befehl liegt um die Gesamtzahl der Seiten zu ermitteln. Aber mir fällt keine Lösung dazu ein, dies zu umgehen ohne auf die Möglichkeit zu verzichten auf die letzte Seite zu springen bzw. das Ende zu sehen.

PHP:
$sql = 'SELECT count(*) FROM traffic';

Das Feld seq ist der Primärschlüssel!
 
Zuletzt bearbeitet:
Oh, sorry. Liegt doch nicht am zählen der Einträge. Hab eine mehrfache und unnötige Schleife in der zugehörigen Template Datei gehabt.
Daran scheint es gelegen zu haben. Trotzdem schönen Dank.
 
Zurück