MariaDB/InnoDB Updates mit steigenden Records viel langsamer



  • Hallo zusammen,

    Eine MariaDB/InnoDB Tabelle ist auf ca. 500 000 Datensätze angewachsen (ca. 50 MB on disk).
    Nun ist das Update sehr viel langsamer geworden:
    Gegenüber dem ursprünglichen Zustand, als ein paar 10 000 Datensätze in der Tabelle waren, ist ein Update um ca. Faktor 5x bis 20x langsamer geworden. (Geschätzt, zum genauen Testen/Vermessen war leider noch keine Zeit)

    Ist dieser Performance-Verlust so zu erwarten bei "nur" ca. 50 MB?
    Welche Optimierungsmöglichkeiten gibt es, ohne die Hardware anzufassen?

    Die Tabelle wurde schon optimiert/defragmentiert, ohne spürbare Verbesserung.
    MariaDB ist noch in etwa konfiguriert wie nach Installation ausgeliefert.
    Nur folgende Parameter-Änderungen wurden getestet:
    innodb_buffer_pool_size vergrößert
    innodb_flush_log_at_trx_commit von 1 auf 0
    Das hat Selects beschleunigt, das Update jedoch kaum.

    Mehrere Updates sind natürlich in einer Transaktion gekapselt.
    Hab schon überlegt, mehrere Update-Statements in einem zusammenzufassen, wo möglich. Das ist aber in diesem Fall relativ aufwändig zu implementieren, u. a. da der eigentliche Fall noch etwas komplizierter ist (Es muss auch eine Werte-Update-Historie bedient werden etc.).

    Vielen Dank!



  • Zu viele Indizes?
    Mal den Execution Plan anschauen (explain).



  • @mechanics sagte in MariaDB/InnoDB Updates mit steigenden Records viel langsamer:

    Zu viele Indizes?
    Mal den Execution Plan anschauen (explain).

    Nein, daran liegt es nicht. Die Tabelle hat keine zusätzlichen Indizes. Nur auto_increment für den PK/Id.


  • Administrator

    @robot Dann womöglich das genaue Gegenteil? Was machst du denn in diesem Update? Wie sehen die aus?



  • Problem ist gelöst, ist jetzt wieder 10 - 30 x schneller: Das Hauptproblem war ein PK (einer anderen gejointen Tabelle), der versehentlich auf 2 Feldern definiert war, anstatt dass das 2. Feld als separater Index definiert wurde.

    (wegen Bedienung einer zusätzlichen Werte-Historie wurde pro "Update" folgende Sequenz in einer Schleife duchgeführt: Select mit Join -> Update -> Insert in Historie. Vermutete zuerst, dass das die Transaktion ineffektiv machen könnte und wollte Select, Updates und Inserts separieren. Aber das scheint jetzt nicht mehr nötig.)

    Vielen Dank für eure Hinweise!