Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL/InnoDB und lang andauernde Abfragen

Erstens denke ich, dass es als Hintergrund nützlich wäre, sich über Multiversion Concurrency Control (MVCC) zu informieren. als Hintergrund zu dieser Antwort.

InnoDB implementiert MVCC, was bedeutet, dass es nicht sperrende Lesevorgänge für reguläres SELECT verwenden kann . Dazu muss kein „Snapshot“ erstellt werden, und tatsächlich hat InnoDB kein wirkliches Konzept eines Snapshots als Objekt. Stattdessen verfolgt jeder Datensatz in der Datenbank seine eigene Versionsnummer und verwaltet einen "Roll-Zeiger" zu einem "Rückgängig-Protokoll"-Datensatz (der noch existieren kann oder nicht), der die Zeile auf ihre vorherige Version modifiziert. Wenn eine ältere Version eines Datensatzes benötigt wird, wird die aktuelle Version gelesen und diesen Roll-Zeigern gefolgt und Datensätze werden rückgängig gemacht, bis eine ausreichend alte Version des Datensatzes erzeugt wird.

Normalerweise bereinigt das System diese Rückgängig-Protokolle ständig und verwendet den Speicherplatz, den sie verbrauchen, wieder.

Jederzeit lang andauernde Transaktionen (Anmerkung:nicht unbedingt eine einzige Abfrage) vorhanden ist, müssen die Undo-Protokolle aufbewahrt (nicht gelöscht) werden, um ausreichend alte Versionen aller Datensätze neu zu erstellen, um diese Transaktion zu erfüllen. In einem sehr ausgelasteten System können sich diese Undo-Protokolle sehr schnell ansammeln und Gigabyte an Speicherplatz verbrauchen. Wenn außerdem bestimmte einzelne Datensätze sehr häufig geändert werden, kann das Zurücksetzen dieses Datensatzes auf eine Version, die alt genug ist, um die Abfrage zu erfüllen, sehr viele Undo-Log-Anwendungen (Tausende) erfordern.

Das macht "Long-Running Queries" teuer und verpönt. Sie erhöhen den Speicherplatzverbrauch für die Aufbewahrung der Undo-Protokolle im System-Tablespace und sie werden aufgrund der Anwendung von Undo-Log-Aufzeichnungen schlecht funktionieren, um Zeilenversionen beim Lesen zurückzusetzen.

Einige Datenbanken implementieren eine maximale Menge an Undo-Log-Speicherplatz, die verbraucht werden kann, und sobald sie diese Grenze erreicht haben, fangen sie an, ältere Undo-Log-Datensätze zu verwerfen und laufende Transaktionen ungültig zu machen. Dadurch wird dem Benutzer die Fehlermeldung "Snapshot zu alt" generiert. InnoDB hat kein solches Limit und erlaubt unbegrenzte Akkumulation.