Pagination im ACP bei Benutzersuche fehlerhaft

  • Affected App
    WoltLab Suite Core

    Hallo Leute,

    wir haben im Forum ca. 5.400 gesperrte Benutzer. Wenn ich unter 'Benutzer suchen' den Zustand 'Gesperrt' wähle, wird mir eine Ergebnisliste mit 40 Seiten a 50 Einträgen angezeigt. Das selbe Problem besteht bei der Suche nach nicht aktivierten Benutzern. Tatsächlich sind es etwas mehr als 2.700, die Ergebnisliste hat allerdings wieder nur 40 Unterseiten a 50 Benutzer.

    Auch ändert sich an der Ergebnisliste nichts, wenn ich die Schnellsuche benutze, wieder nur 40 Unterseiten. Wenn ich einfach nur auf 'Benutzer' klicke, erhalte ich die richtige Anzahl an Unterseiten. Es muss also mit der Suche nach Kriterien zu tun haben.

  • Ich meine dass hier einfach ein generelles Limit vorliegt, keiner wird normalerweise alle seiten durchgehen um sich nen Überblick zu verschaffen sondern erst mal die Suchpararmeter verfeinern.

    Ähnliche Limits gibts eigentlich überall bei der Suche um gerade in sehr großen Foren eine zu starke Belastung des MySQL-Servers zu vermeiden, stell dir mal vor ich suche nach irgend einem begriff der in 1 mio Beiträgen vorkommt, das wäre eine Gigantische Datenmenge die dann in der Datenbank nochmals zwischengespeichert werden muss ;)

  • Ein Limit an dieser Stelle macht in meinen Augen überhaupt kein Sinn. Immerhin ist die Anzeige 'alle Benutzer' genauso schnell erzeugt, wie die Ergebnisliste der Benutzer die nach Suchkriterien erzeugt wird.

    Bei der Abfrage an die Datenbank wird ja nur gefragt, wieviele Ergebnisse (Benutzer) zu den Suchkriterien gefunden wurden und gleichzeitig werden die ersten 50 ausgeliefert (Dauert bei mir ca. 0.0041 Sekunden). Anschließend wird die Gesamtzahl der gefundenen Einträge durch die Anzahl der anzuzeigenden Ergebnisse (50) geteilt. Ich denke, dass sogar bei weitaus höheren Anzahlen an gefundenen Einträgen, die Abfrage bzw. die Antwort der Datenbank nicht merklich länger dauern würde.

    ...keiner wird normalerweise alle seiten durchgehen um sich nen Überblick zu verschaffen sondern erst mal die Suchpararmeter verfeinern.


    Wieso wird dann bei der Anzeige aller Benutzer die richtige Anzahl an Unterseiten dargestellt? Diese Liste ist ja weitaus umfangreicher als meine bereits nach Kriterien gefilterte Liste.

  • Das ist der Unterschied zwischen einer Suche und einer stumpfen auflistung.

    Ersteres setzt vorraus dass das Suchergebnis zwischengespeichert wird um später darin blättern zu können während letzeres einfach nur alle Datenbank-Einträge einmalig auflistet.

    Du musst bedenken dass bei der Suche ja sehr viele verschiedene Pararmeter aus vielen verschiedenen Tabellen zur Suche verwendet werden können, dies ist ein deutlich größerer Aufwand als nur ein Query über die usertabelle und daher wird hier mit Limits gearbeitet.

    Das ist btw an allen Möglichen Stellen im Forum so, wann immer man etwas "sucht" wird in irgend einer Form ein maximales Limit vorgegeben ;)

  • Das ist übrigens auch im Frontend nicht anders. Suche ich unter "Erweiterte Suche" nach Beiträgen des Benutzers "Morik", erhalte ich als Resultat die üblichen 50 Seiten mit je 20 Treffern. Früher gab es da sogar noch einen Hinweis, dass es weitere Treffer gibt. Klicke ich auf den Link "Beiträge" in Moriks Beitragsseitenleiste, werden mir 150 Seiten angeboten.


    Gruß norse

    Zugang zu meinen Arbeiten und dem dazugehörigen Support bekommt Ihr bei Interesse hier und hier.

  • Ersteres setzt vorraus dass das Suchergebnis zwischengespeichert wird...


    Wo wird das Suchergebnis zwischengespeichert? Beim Blättern in den Suchergebnissen wird der Query meiner Meinung nach jedesmal neu gesendet, nur das LIMIT der SQL Abfrage ändert sich. Somit sollte es genauso lange dauern, Ergebnis-Seite 1 auszuliefern, wie Ergebnis-Seite 102. Kann ja sein, dass es absichtlich so programmiert worden ist, aber eine Reduzierung der Datenbank-Nutzung entsteht dadurch sicher nicht. Grade im Backend macht ein Limit kein Sinn, da dort ja nur registrierte Benutzer Zugriff haben.

    Überings ist die Suche nach allen Beiträgen von Morik ein gutes Beispiel. Hier wird ja auch nach Suchkriterien gefiltert. Klickt man auf 'Beiträge' werden alle gelistet, Geht man über die Erweiterte Suche nur 50 Seiten. Doch wo ist der Unterschied der Abfrage der Datenbank? Welche Ergebnisseite wird langsamer ausgeliefert bzw. erzeugt mehr Traffic?

  • Das Suchergebnis wird in der Datenbank gespeichert und bei jedem weiteren Aufruf aus dieser wieder ausgelesen.

    Wenn du dir die URL genau anschaust dann wirst du einmal nur acp/index.php?user-list/&xxx sehen und bei Verwendung der Suche acp/index.php?user-list/1/&xxx haben, wobei die 1 die ID deiner Suche ist unter der das Ergebnis in der Datenbank abzurufen ist.

    Die Suche nach meinen Beiträgen ist hier wieder das klassische beispiel:

    einmal user-post-list/1345201-morik/, hier wird einfach nur einmal über die Postliste mit einer WHERE abfrage über alle Posts nen Query gemacht was sehr schnell funktioniert und dann über die Suche search-result/2299418/ wo das Ergebnis zunächst in der Datenbank zwischengespeichert wird und dann bei jedem Abruf nur noch von dort geladen wird.

  • Der Erläuterung von Morik ist nichts hinzuzufügen, die Auflistung der Benutzer mit bestimmten "Eigenschaften" nutzt im Hintergrund das Suchsystem inklusiver der Beschränkung der maximalen Trefferanzahl. Diese, sowie vergleichbare Stellen, nutzten initial tatsächlich eine Live-Abfrage, diese stellte sich jedoch in der Praxis als zu ineffektiv dar und wurde ab einer gewissen Datenmenge praktisch unbrauchbar.

    Alexander Ebert
    Senior Developer WoltLab® GmbH

  • Wenn ich Morik und Alex richtig verstehe, würde es dort zu exakt denselben Problemen kommen wie bei der Suche im Frontend.


    Gruß norse

    Zugang zu meinen Arbeiten und dem dazugehörigen Support bekommt Ihr bei Interesse hier und hier.

  • Wenn ich die Suche nach nicht aktivierten Benutzern direkt über die Datenbank tätige, erhalte ich die Ergebnisse in einem Bruchteil einer Sekunde. Auch geht das Weiterblättern in den Ergebnisseiten der DB rasant schnell. Wenn ich die Antworten richtig verstehe, ist es zu aufwändig, die Beschränkung der maximalen Trefferzahlen fürs Backend aufzuheben. Für mich bedeutet das, dass ich nicht alle Benutzer (bei mehr als 2k Treffern), mit einem bestimmten Kriterium, übers Backend aufgelistet bekommen kann.

  • Nur wozu muss es im Backend eine Beschränkung der maximalen Trefferzahlen geben?

    Wiso verschiedene Systeme nutzen und dann noch in die gefahr laufen dass eine Funktion im Backend nicht mehr nutzbar ist wenn das Forum eine entsprechende größe Erreicht ?

    Ich mein die Frage ist jetzt nicht ob das limit bei 2000 oder bei 10000 notwendig wird, aber die Software soll auch bei 100000 usern usw funktionieren und je größer die potentielle Anzahl an usern um so schwerer wird der MySQL server belastet, um so mehr Abeitsspeicher benötigst du und um so länger benötigt php um die daten zuerst auszulesen, dann wieder an den MySQL-Server zu senden um dann von 100000 treffern doch nur 50 anzuzeigen...

  • Vielen Dank für Eure Antworten. Der Link von rs90 hilft mir insofern weiter, als das ich vorübergehend das Limit erhöhen kann um meine geplanten Arbeiten zu erledigen. VG und schönen Feierabend :)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!