Sortierung Listen - Performance

chetti85

Grünschnabel
Schönen guten Tag zusammen!

Ich hätte gerne eure Meinung zu einem Thema was mich aktuell beschäftigt.

Folgender Sachverhalt:

- Große Datenmengen in einer MySQL Datenbank. (aktuell: 80.000 Datensätze > schnell steigend)
- Verbindung von PHP zur Datenbank, Web-Frontend in HTML, CSS und JQuery
- Websockets im Einsatz (z.B. NodeJS)

Im Frontend sollen die Daten in Listen dargestellt werden.
Es soll folgende Funktionen geben:

- Sortierung der Elemente
- Blätterfunktion
- Suchmöglichkeit mit verschiedenen Kriterien (Freie Text Suche und Suche mittels Auswahlboxen)

Wie würdet ihr die Sortierung/Suche durchführen?
- Alle Daten mit 1 Request laden, die Liste füllen und mittels Javascript Sortierbar und Durchsuchbar machen oder
- Daten nur für die jeweils ausgewählte Seite mit (Limit) von der Datenbank abfragen und nur diese Daten darstellen. (Suchfunktion per SQL Anweisung)


Vermutlich sollte man bei sehr großen Datenmengen das vorladen für Javascript Sortierung und Suchfunktion nicht nutzen? (Rechnerlast vs Serverlast ... )

Ich bin auch offen für bessere Lösungen! Vielleicht kennt ihr auch eine Seite wo es so einen Vergleich (Benchmark) gibt?!

Vielen Dank für eure Beteiligung! :)
 
Also 80.000 hört sich zwar viel an (wobei es auch darauf ankommt wie viele Daten ein Datensatz enthält) aber für mySQL ist es erstmal nicht viel. Die Frage ist was "schnell steigend" bedeutet.

Ich denke aber trotzdem das es wohl das Beste ist wenn du immer 10, 20, ... 50 Datensätze anzeigst und das die Sortierung und die Suche über die Datenbank läuft.

Je nachdem was für Daten du hast, kannst du die Menge ja vielleicht dadurch verkleinern das du es auf mehrere Tabellen verteilst.
 
Hallo chetti,

Wie würdet ihr die Sortierung/Suche durchführen?
- Alle Daten mit 1 Request laden, die Liste füllen und mittels Javascript Sortierbar und Durchsuchbar machen oder
- Daten nur für die jeweils ausgewählte Seite mit (Limit) von der Datenbank abfragen und nur diese Daten darstellen. (Suchfunktion per SQL Anweisung)

Ersteres würde ich auf keinen Fall bei 80 000 Datensätzen machen!
  1. Es werden Datensätze aus der DB abgerufen, die der Kunde gar nicht braucht.

  2. 80.000 Datensätze per JavaScript zu sortieren und zu filtern? Zum Filtern sind doch Datenbanken auch spezialisiert (sofern Indices oder Partitionierung)

Eventuell könntest du auch noch ein wenig IndexedDB ins Spiel bringen. Aber ich würde erstmal Lösung #2 probieren.
 
Hi und Willkommen bei tutorials.de,

ganz klar: Alles direkt in der Datenbank, per SQL-Anweisung.

a) Datenübertragung ist auch bei heutigen schnellen Internetzugängen
nicht zu vernachlässigen, vor allem auf Serverseite.
Wenn man für jeden Client die ganze DB rausschickt...das ist bestenfalls verrückt.

b) "Schnell wachsen" der DB ist relativ, aber nicht jeder Clientcomputer
schafft so viel wie der Server. Irgendwann ist die DB vllt. so groß,
dass allein die Speichermenge für einen alteren Computer/Smartphone/... zu viel ist.

c) Geschwindigkeit beim Filtern/Sortieren
Nicht nur, dass MySQL in C/C++ geschrieben ist
und schon deswegen einen Geschwindigkeitsvorteil zu JS hat;
zusätzlich steckt auch sehr viel Optimierungsarbeit drin,
die man nicht einfach schnell mal nachmachen kann.

Benchmarks: Die Sache ist so eindeutig, dass die eigentlich nicht nötig sein sollten.

edit: Was, zwei Beiträge verpasst :D
 
Hallo!

Vielen Dank für eure schnellen Antworten!

Ihr teilt die selbe Meinung wie ich bereits seit langer Zeit!
Diese Methode nutze ich auch so und führe Aktionen direkt über die Datenbank aus und das ist auch sehr performant mit "großen" Datenmengen.

Es werden ca. 15.000 Datensätze pro Monat mehr. Für eine Datenbank sind natürlich 80.000 Datensätze keine riesen Menge :)!

Aus folgendem Grund hat mich diese Frage beschäftigt:

Im Netz gibt es Javascript Grids (fertige) die genau dieses Verfahren nutzen. Sie laden die ersten 50 Datensätze und im Hintergrund alle restlichen asynchron nach. Dann wird die Filterung + Sortierung direkt über das Grid ausgeführt.

Meiner Meinung nach ist das doch aus folgenden Kriterien nicht praktikabel:

1. Die Sortierung läuft nicht über den Server sondern direkt über den Browser der die ganzen Datenmengen zwischenhält. Dementsprechend hängt die Geschwindigkeit dann vom Rechner des Nutzers ab...

2. Es brauchen nicht alle Datensätze aus der DB geliefert werden wenn man nur 20 Stück braucht. Das würde das Grid nur unnötig belasten..

3. Würde die Datenbank dann für alle Nutzer die diese Liste nutzen immer komplett alle Datensätze auslesen und bereitstellen und somit unnötig Speicher für die Abfragen verbrauchen.


Eine Frage hab ich noch dazu...

Wie regel ich per Sockets das dann, wenn der Nutzer nur 20 Datensätze sieht, der PUSH der Aktualisierung auch nur an die Personen geht welche diesen Datensatz auch gerade in ihrer Liste sehen? An alle melden wäre ja unnötig..

Habt ihr dafür eine Idee oder ist das von mir logisch falsch :)?
 
Zu deiner letzen Frage, falls ich sie richtig verstanden habe:
Der Server muss wissen welcher Client welche Datensätze hat. Du musst also jedesmal wenn du Datensätze an einen Client schickst eine Zuordnung erstellen (Entweder alle Datensätze pro Client, oder alle Clients pro Datensatz) und diese so lange behalten, bis der Client disconnected. Wenn es nun Aktualisierungen gibt schickst du diese Aktualisierung an alle dem Datensatz zugeordneten Clients.
 

Neue Beiträge

Zurück