Query für goToPost verwendet nicht immer den Index

  • Betroffene Version
    WoltLab Suite 5.4
    Betroffene App
    WoltLab Suite Forum

    Nach längeren suchen ist uns aufgefallen das der Query

    SQL
    SELECT  COUNT(*) AS posts
                    FROM    wbb2_post post
                    WHERE post.threadID = '430' AND post.isDisabled = 0 AND post.isDeleted = 0 AND (time < '1469119244' OR (time = '1469119244' AND postID < '1640234') OR postID = '1640234')

    Extrem lange benötigt zum ausführen

    Wie man im Log sehen kann, verwendet dieser Query keinen Index und durchsucht die komplette Datenbank

    Code
    # Time: 221018 12:41:37
    # User@Host: gekürzt
    # Thread_id: 1603266  Schema: Datenbank_name  QC_hit: No
    # Query_time: 13.866583  Lock_time: 0.000033  Rows_sent: 1  Rows_examined: 3415846
    # Rows_affected: 0  Bytes_sent: 68
    SET timestamp=1666089697;
    SELECT  COUNT(*) AS posts
                    FROM    wbb2_post post
                    WHERE post.threadID = '430' AND post.isDisabled = 0 AND post.isDeleted = 0 AND (time < '1469119244' OR (time = '1469119244' AND postID < '1640234') OR postID = '1640234') -- '....url....';

    Ich habe dadrauf hin natürlich überprüft ob die Index vorhanden sind, und das ist der Fall.

    Dies ist der DDL zu der Tabelle

    Ausgabe von Explain

    Ich habe dies in einigen Test-Foren gegen getestet, dort werden, die Index jedoch richtig im Query verwendet, nur in dieser Datenbank nicht.

    Der Query-Optimizer verwendet jedoch manchmal, den richtigen Index.(threadID_2)

    Wenn hier einUSE INDEX(threadID_2) verwendet werden würde, müsste der Query-Optimizer hier nicht abwägen ob dies sinnvoll oder nicht ist die ganze Datenbank zu durch suchen. Bei kleinen Tabellen ist dies kein Problem, aber sobald die Tabelle mehrere Millionen Einträge hat, hingegen nicht mehr, dann dauert der Query mehrere Sekunden. Würde der Query nur einmal ausgeführt werden müssen, wäre es okay, aber dies kann durch jeden Benutzer ausgeführt werden.

  • Edit:

    Manchmal bekomme ich aber folgenden Ausgabe, wo der Index richtig verwendet wird und die Abfrage schnell ist

    • Offizieller Beitrag

    Hallo,

    was ein Käse. Wir haben selbst schon beobachtet, dass MySQL manchmal einen unsinnigen Index nutzt, das hat sich aber auf den time-Index beschränkt. Dieser wird mit WoltLab Suite 6.0 voraussichtlich aufgrund von Nutzlosigkeit entfernt.

    Du könntest probieren, die Indexstatistiken mit einem ANALYZE TABLE wbb2_post neu aufzubauen, falls MySQL sich da irgendwie verrannt hat.

    Falls du entweder MySQL 8 oder MariaDB ab mindestens Version 10.6 nutzen würdest [1], könntest du auch einzelne Indices auf „unsichtbar“ stellen, sodass diese von den Abfragen ignoriert werden. Der Vorteil ist, dass der Index technisch weiterhin existiert, sodass etwaige Upgrade in Zukunft auch sauber weiter möglich sein werden.

    [1] Ich empfehle MySQL 8.

    • Offizieller Beitrag

    Hallo,

    was ein Käse. Wir haben selbst schon beobachtet, dass MySQL manchmal einen unsinnigen Index nutzt, das hat sich aber auf den time-Index beschränkt. Dieser wird mit WoltLab Suite 6.0 voraussichtlich aufgrund von Nutzlosigkeit entfernt.

    Das mit time ist zwischenzeitlich erfolgt.

    Hat sich bezüglich des hier beschriebenen Problems etwas ergeben? Ich bin versucht, das Thema auf „nicht reproduzierbar“ zu setzen, da es nicht wirklich actionable ist. Für eine zuverlässige Diagnose müssten wir vermutlich direkt mit der betroffenen Datenbank interagieren können, um Tests vorzunehmen.

  • Tim Düsterhus 12. Juli 2023 um 11:20

    Hat das Label 6.0.0 Beta 1 hinzugefügt.
  • Tim Düsterhus 12. Juli 2023 um 11:20

    Hat das Label Behoben hinzugefügt.
    • Offizieller Beitrag

    Hallo,

    ich setze das hier mal auf „Korrigiert mit 6.0“, weil dann der time-Index entfällt. Etwaige weitere Probleme sollten am besten in einem separaten Thema besprochen werden und sinnvollerweise sollte dann auch ein Zugriff auf die Datenbank ermöglicht werden, um direkt und gezielt testen bzw. analysieren zu können. Mit WoltLab Suite 6.0 werden auch die Systemanforderungen an die MySQL-Version angepasst, sodass ältere Versionen mit schlechterem Optimizer auch schon mal „raus sind“.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!