Frage, laden von vielen Datensätzen beschleunigen

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.306
Nabend in die Runde... vor ca. 7 Jahren haben mein Kollege und ich bei uns in der Firma im Intranet eine Datenbank aufgebaut wo wir alle unsere Kunden hinterlegt haben. Diese Datenbank haben wir damals nach unseren Wünschen und Vorstellungen angepasst, ein "pagination" zum Blättern haben wir ebenfalls hinterlegt.

Nun wollte Chef sich vor ein paar Tagen alle Kunden von (Beispiel) 2012 - 2015 anzeigen lassen, ohne das er blättern muss. Möchte er einfach nicht... er wollte alle auf einen Blick haben. Ausgabe umfasst etwas über 30.000 Datensätze, was dazu führt dass das laden der Seite etwas dauert.

Die Ausgabe wird simple als 'table' generiert. In der ersten Zeile ist halt der 'th' und dann kommen pro Kunde ein 'tr' mit den einzelnen Feldern. Das Laden dauert laut Chrome (hab diese Performance Analye gestartet) grob 20 - 30 Sekunden.

Nun wäre meine Frage, kann man das Laden überhaupt beschleunigen oder limitiert da der Browser oder doch etwas anderes? In der Tabelle ist in dem ersten TD Feld ein Icon zum bearbeiten des Datensatzes... Dieses muss ja dann ebenfalls X mal erstellt werden. Vielleicht ist das auch ein Problem. Aber mich würde interessieren, ob man nun Apache oder PHP "tunen" kann, oder ob ich den Quellcode umbauen müsste?!

Wenn ich in der MySQL Datenbank exakt diesen SELECT Befehl ausführe, dauert es grob 2 Sekunden bis ich eine Ausgabe habe. Daher vermute ich mal, dass es nicht die SQL Datenbank ist, die da limitiert. Da es meine EDV bei uns in der Firma ist, soll es also an den Änderungen der Einstellungen nicht hapern... ich vermute aber mal, dass Problem wird eher im HTML / PHP Code liegen, lasse mich da aber gerne aufklären.

Gruß, Domi

Nachtrag: Ich hab den Prefix vergessen... könnte den ein Mod nachtragen? Ich glaube in dieser Foren-Software kann ich nämlich den Titel von meinem Topic nicht bearbeiten. Oder ich bin blind...
 
Kannst ja mal deinen PHP code als Shell Script laufen lassen und darüber die Daten ausgeben lassen. Dann kannst du eher abschätzen woran es hapert. Ich würde aber eher vermuten dass es Richtung HTML/Browser hinaus läuft.

Je Datensatz ein Icon = 30.000 Icons. Das sind 30.000 Objekte die der Browser darstellen muss, ich kann mir gut vorstellen, dass der Browser da gut zu tun bekommt.

Wenn du im Browser das Ergebnis offen hast, kannst du dieses ja mal über den Browser lokal speichern, Cache leeren und dann lokal Aufrufen und schauen wie lange es braucht.

Hmm, hab da noch ne andere idee. Schau mal in den access log vom Webserver, nicht das Chrome das Icon 30.000 mal vom Server lädt.

Edit: Ich vermute mal dein PHP code durchläuft eine Schleife um die einzelnen Zeilen der Tabelle zu erzeugen. Wenn er da 30.000 mal durch muss kann es natürlich ne weile dauern.
 
Nabend, da ich gerade noch ein paar andere Baustellen habe, würde ich morgen auf der Arbeit mal nachschauen. Aber ja, ich habe eine Klasse für die Daten und darin eine Methode die das alles für mich ausließt. Den 'fetch_assoc' schreibe ich in eine Variable und diese Daten ziehe ich anschließend mit einer 'foreach()' Schleife aus der Variable und lasse mir in der Schleife dann den <tr><td></td></tr> generieren.

Ich schaue dann auch mal, wie lange 'wget' auf dem Server braucht, bis er mir den Datensatz ausgeben lassen kann.
 
(...) limitiert da der Browser oder doch etwas anderes?
Du kannst mit Xdebug (PHP) und Lighthouse (Chrome, F12 ->"Audits") Performance-Profile erstellen.

Ansonsten:

- oder klassischer Excel-Report (zB. mit https://github.com/MewesK/TwigSpreadsheetBundle) mit Links für Aktionen :)
 
  • Gefällt mir
Reaktionen: BeBur und new Account()
Domi83 schrieb:
Nun wollte Chef sich vor ein paar Tagen alle Kunden von (Beispiel) 2012 - 2015 anzeigen lassen, ohne das er blättern muss. Möchte er einfach nicht... er wollte alle auf einen Blick haben. Ausgabe umfasst etwas über 30.000 Datensätze, was dazu führt dass das laden der Seite etwas dauert.

Frag deinen Chef mal, was sein eigentlicher Use-Case ist. Der guckt sich ja nicht aus Spaß 30k Kundendatensätze an. Wahrscheinlich seid ihr mit einem CSV / Excel Export besser beraten. Oder da es deine IT ist, könntest du auch einen DB Nutzer anlegen, der nur lesende Rechte hat und beim Chef direkt Tools wie HeidiSQL oder EMS MySQL Manager nutzen bzw mittels ODBC und Access die Daten lokal für ihn spiegeln.

Da Tabellen mit das komplizierteste sind, was ein Browser rendern können muss, wird bei der Anzahl an Datensätzen tatsächlich dort limitierterende Faktor sein.
 
Ich denke eher, der Chef liest aus den 30k Datensätzen etwas heraus, was er denkt, was schwer für euch umzusetzen wäre, dabei scheiterst es mal wieder nur an der Kommunikation.
Ich glaube kaum, dass der die Liste auswendig lernt und eine Datentabelle mit mehr als 50 Einträgen ist schon blödsinnig genug, 30.000 Einträge habe ganz klar einen anderen Zweck als eine visuelle Datenmatrix eigentlich haben sollte.

Ich gehe ganz stark davon aus, dass dort Statistik gefragt ist und der Chef sich seinen Teil selbst zusammen stellt. Redet mal mit ihm, welche Zahlen und Daten er wirklich haben möchte.

Ansonsten: Ja, eine HTML Tabelle mit 30.000 Einträgen, ohne Javascript-Tricks, ist eine große Performancebremse und kann unter Umständen Browser/Gerätespezifisch auch zu Abstürzen führen und/oder gar nicht mehr richtig dargestellt werden.

Edit: Kann mir durchaus vorstellen, dass er sich die Tabelle komplett in Excel kopieren möchte, um dann da Charts draufzulegen. So typische Controlling Dinge wie eine ABC Analyse oder Kunden Pro Jahr oder stärkste Monate usw. Je nachdem, was ihr da an Daten habt. Ein Controlling-Dashboard ist wahrscheinlich das, was er in wirklichkeit haben möchte. Frag ihn mal, was er aus den Daten interpretiert oder interpretieren möchte.
 
Zuletzt bearbeitet:
Hallo Leute und schon mal vielen Dank für die Ansätze. Gestern kam ich leider nicht dazu, mich damit mal zu befassen. Da ich so etwas wie der IT-Hausmeister bin, habe ich mehrere Baustellen auf denen ich tanze :D

Was die Daten angeht, Excel ist er jetzt nicht so fit drin, da bittet er mich auch, die Tabellen zu erstellen wie er sie braucht um diese dann nur noch zu füttern. Und da fällt mir dann ein, dass er so etwas wie Diagramme (Balken, Torten etc.) noch nie wollte, verwirrt ihn zu sehr.

Dem fällt bei nackten Zahlen schneller etwas auf als bei irgendwelchen Diagrammen. Hat er uns auch relativ oft in den letzten 13 Jahren bewiesen. Er wünscht sich auch immer, dass wir das auch erkennen, geht aber nicht :D Aber da er nun erst einmal im Urlaub ist, frage ich ihn noch mal ob ich ihm seinen Wunsch irgendwie anders erstellen kann.

HeidiSQL verwende ich selbst sehr gerne um in den MySQL Datenbanken zu arbeiten, wäre also auch eine Option. Zur Not baut man ihm eine "View-Tabelle" (glaube so heißen die) und vielleicht kann er damit eher etwas anfangen. Alternative wäre sonst wirklich ein Excel Export zu bauen, damit er an sein Ziel kommt.

Das mit dem Excel Export hatte ich auch schon beim suchen im Netz als Ansatz gefunden und ein Bekannter schlug so etwas ebenfalls schon mal vor und war hinterher erstaunt, dass ich ganz oldschool mit Notepad++ ohne irgend ein Framework wie Laravell etc. arbeite :D

Aber ich denke mal, ich komme schon irgendwie an mein Ziel und bedanke mich schon mal für die Hinweise und Tipps. So kann ich ihm sagen, dass das aufbauen / rendern von Tabellen mit solch einer Anzahl an Datensätzen auf einen schlag nicht so einfach beschleunigt werden kann.

Vielleicht würde ihm ja auch der "Lazy-Load" helfen... dann muss er zwar erst einmal scrollen, bis er alles hat, aber zumindest hätte er dann step-by-step alles drin.

Gruß, Domi
 
Ist ‘table-layout’ to ‘fixed’ gesetzt? 30 Sekunden hört sich für mich so an, als ob es beim HTML/CSS Optimierungspotential gibt. Stell doch mal eine Tabelle mit Testdaten online, damit könnte man den Fall konkret nachvollziehen. Wundert mich immer wieder hier, dass Entwickler mit Code geizen...

Domi83 schrieb:
Vielleicht würde ihm ja auch der "Lazy-Load" helfen... dann muss er zwar erst einmal scrollen, bis er alles hat, aber zumindest hätte er dann step-by-step alles drin.

Wenn er ohnehin immer alle Daten angezeigt haben möchte, könnte man das Laden auch gleich häppchenweise vornehmen, damit er beim Scrollen möglichst keine Wartezeit hat.

Eine bessere Alternative wäre, die Daten sukzessive in der Tabelle zu rendern und dabei eventuelles Scrolling zu beachten (sprich den aktuellen Ausschnitt zuerst zu behandeln). Sowas wie https://clusterize.js.org/
 
Moin, ich habe eben mal stumpf ohne Breitenangabe den CSS "table-layout: fixed" gesetzt und im Firefox lädt der Datensatz mit aktuell 5.000 Datensätzen innerhalb von 5 Sekunden, Chrome wird wohl eine feste Breite dazu haben wollen, aber das hat schon mal etwas gebracht :)

Bezüglich dem Quellcode, ich bin eigentlich auch immer ein Freund von Informationen, denn Glaskugeln sind aktuell Mangelware... soll daran (an sich) auch nicht scheitern, ich muss nur gucken das ich einen Schnitt zwischen "darf ich posten" und "darf ich nicht posten" finde ;)

Nachtrag: Korrektur, Strg + F5 führte zum neuladen der CSS und nun scheint auch Chrome schneller zu sein. Das Laden dauert bei aktuell 5.000 Datensätzen maximal 10 Sekunden... :)
 
Zurück
Oben