Anzeigen aktualisieren legt MySQL lahm

  • Hallo,


    wenn ich unter "Anzeigen aktualisieren" die Funktion "Forenstatistiken aktualisieren" ausführe, wird folgendes SQL-Statement ausgeführt:


    (aus der UpdateBoardsAction.class.php kopiert)


    $sql = "UPDATE wbb".WBB_N."_board board
    SET threads = (
    SELECT COUNT(*)
    FROM wbb".WBB_N."_thread
    WHERE boardID = board.boardID
    AND isDeleted = 0
    AND isDisabled = 0
    ),
    posts = (
    SELECT IFNULL(SUM(replies), 0) + COUNT(*)
    FROM wbb".WBB_N."_thread thread
    WHERE boardID = board.boardID
    AND isDeleted = 0
    AND isDisabled = 0
    )
    WHERE board.boardID IN (0".$boardIDs.")";


    Diese Abfrage bringt bei uns bei der Ausführung den Boardbetrieb für 20 Minuten zum Erliegen, die User kriegen erst keine Antworten mehr zu ihren Requests, und dann irgendwann die Fehlermeldung "too many connections". Die Datenbank braucht dann ziemlich lange, bis sie sich davon erholt hat.


    Die Abfrage setzt zum Updaten offenbar ein Lock auf die board-Tabelle, das aufrechterhalten wird, bis die recht aufwendigen Unterabfragen durchgelaufen sind.


    Wäre schön, wenn Ihr diese Abfrage in zukünftigen Versionen etwas zerlegen oder eine temporäre Tabelle benutzen könntet.


    Daten zum Board:
    WBB 3.1.3 auf Dedicated Server
    Themen: 70 000
    Datenbankgröße: 1,76 GB

  • Mit der Anzeigen aktualisieren Funktion sollte mana uch vorsichtig sein, und diese nicht exzessiv nutzen. Es empffiehlt sich, so etwas nachts zu machen, und das Board in den Wartungsmodus zu versetzen.

    "A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP" — Leonard Nimoy

    • Official Post

    Innerhalb des normalen Forenablaufs gibt es in der Regel keine Notwendigkeit für die Benutzung von "Anzeigen aktualisieren". Diese Funktion ist primär für den Datenimport bzw. Massenverarbeitungen im ACP gedacht.

    Alexander Ebert
    Senior Developer WoltLab® GmbH

  • Innerhalb des normalen Forenablaufs gibt es in der Regel keine Notwendigkeit für die Benutzung von "Anzeigen aktualisieren". Diese Funktion ist primär für den Datenimport bzw. Massenverarbeitungen im ACP gedacht.

    Ich muss die Funktion benutzen, wenn ich alle paar Wochen per Massenverarbeitung unser "Testforum", eine Art Sandbox zum Ausprobieren von Forenfunktionen wie Bilderupload etc., geleert habe.


    Wie gesagt, es ist nichts, was mich täglich stört, aber ein Standardfeature der Forensoftware, die das Forum wegen Überlastung der Datenbank unbrauchbar macht, ist natürlich grundsätzlich nicht akzeptabel und sollte verbessert werden. Zumal das in diesem Fall vermutlich relativ schnell zu lösen ist, indem man das Update in mehrere Aktionen zerlegt, zum Beispiel das Ergebnis zunächst in eine temporäre Tabelle schreibt und über die dann die boards-Tabelle updatet.


    Ich habe es übrigens das letzte Mal heute frühmorgens gegen 5 Uhr versucht, als gerade mal 7 Leute im Forum waren. Die konnten das Forum dann aber trotzdem erstmal nicht benutzen.


    Die Empfehlung, man solle das Board jedesmal in den Wartungsmodus versetzen, wenn man eine "Anzeigen aktualisieren"-Funktion aufruft, halte ich für aus der Luft gegriffen. Die meisten Funktionen von "Anzeigen aktualisieren" sind von Woltlab mit viel Aufwand sehr schön so gestaltet worden, dass sie automatisch in viele, im laufenden Betrieb nicht störende Schritte zerteilt werden und deshalb auch in etwas größeren Foren gut skalieren. Diese Funktion hier bildet da bisher eine Ausnahme.


    Gruß,
    Marcus