Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

MySQL-Dirty-Pages

Aufgrund des WAL-Mechanismus erstellt InnoDB beim Aktualisieren einer Anweisung eine Festplattenoperation namens Schreibprotokoll, bei der es sich um ein Redo-Protokoll handelt. Nachdem das Redo-Protokoll in den Speicher geschrieben wurde, wird es an den Client zurückgegeben, was darauf hinweist, dass das Update erfolgreich war.

Der Vorgang des Schreibens von Daten aus dem Speicher auf die Festplatte wird als Leeren bezeichnet. Vor dem Leeren stimmen die tatsächlichen Daten nicht mit den Daten in der Datenbank überein, da die Daten basierend auf dem Redo-Protokoll aktualisiert, aber noch nicht geschrieben wurden und die Datenbank alt ist. Wenn der Inhalt der Speicherdatenseite nicht mit der Festplattendatenseite übereinstimmt, wird die Speicherseite als schmutzige Seite bezeichnet. Nachdem der Speicher geschrieben wurde, ist er konsistent und wird als saubere Seite bezeichnet.

Wenn MySQL gelegentlich sehr langsam läuft, werden wahrscheinlich fehlerhafte Seiten gelöscht. Der Prozess zum Auslösen einer Datenbankbereinigung

  • Wenn das Redo-Protokoll voll ist, stoppt das System alle Aktualisierungsvorgänge und verschiebt den Prüfpunkt nach vorne, um Platz für weiteres Schreiben zu schaffen.
  • Wenn das System nicht genügend Speicher hat und nicht genügend neue Speicherseiten vorhanden sind, werden einige Datenseiten gelöscht und für andere Datenseiten freigelassen. Wenn schmutzige Seiten gelöscht werden, werden sie zuerst auf die Festplatte geschrieben.
  • Wenn MySQL im Leerlauf ist.
  • Beim normalen Herunterfahren von MySQL
  • Im ersten Fall ist das Redo-Log voll, was InnoDB vermeiden möchte, da das gesamte System dann nicht mehr aktualisiert werden kann, was inakzeptabel ist.
  • Im zweiten Fall ist der Speicher voll und muss zuerst auf die Festplatte geschrieben werden. InnoDB verwendet den Pufferpool zur Verwaltung des Speichers. Es gibt drei Zustände
  • Unbenutzte Speicherseiten
  • Gebraucht und ist eine saubere Seite
  • Verwendete und verschmutzte Seiten (müssen nach der Löschung auf die Festplatte geschrieben werden)

Daher stellen wir bei der Verwendung der Datenbank manchmal fest, dass die Datenbankleistung plötzlich nachlässt. Dies kann auf die Verarbeitung fehlerhafter Seiten zurückzuführen sein.

Kontrollstrategie für das Leeren schmutziger Seiten

  • Innodb_io_capacity-Parameter, dieser Parameter teilt Innodb Ihre Festplatten-E/A-Kapazität mit. (Mit Formel berechnet)
  • Es gibt zwei Hauptfaktoren für das Leeren von InnoDB: das Verhältnis von Dirty Pages und die Geschwindigkeit beim Schreiben des Redo-Logs
  • innodb_max_derty_pages_pct ist die Obergrenze des Dirty-Page-Verhältnisses, der Standardwert beträgt 75 %. Passen Sie den Parameterwert Innodb_io_capacity so an, dass das Dirty-Page-Verhältnis 75 % nicht überschreitet und der Tabellenbereich verkleinert wird

Szenariobeispiel: Die Datenbank nimmt zu viel Speicherplatz ein und die Hälfte der Daten in der größten Tabelle wird gelöscht, die Größe der Tabelle bleibt jedoch unverändert.

Datenlöschungsprozess

Wenn Sie R4 löschen möchten, markiert die InnoDB-Engine nur den Datensatz R4 als gelöscht. Wenn später ein Datensatz mit einer ID zwischen 300 und 600 hinzugefügt wird, wird diese Position erneut verwendet, die Größe der Datenträgerdatei wird jedoch nicht reduziert.

Wenn alle Datensätze einer Datenseite gelöscht werden, kann die Datenseite wiederverwendet werden.

Hinweis: Die Wiederverwendung von Datenseiten unterscheidet sich von der Wiederverwendung von Datensätzen.

  • Wird beispielsweise der Datensatz R4 gelöscht und eine Zeile mit der ID 400 eingefügt, kann der Platz direkt wiederverwendet werden. Wird jedoch eine Zeile mit der ID 800 eingefügt, kann die Position nicht wiederverwendet werden.
  • Nachdem jedoch alle Datensätze auf der gesamten Datenseite Seite A gelöscht wurden, wird Seite A als wiederverwendbar gekennzeichnet. Wenn eine neue Datenseite zum Einfügen eines Datensatzes mit der ID=50 benötigt wird, kann Seite A wiederverwendet werden.
  • Wenn wir den Löschbefehl verwenden, um die gesamten Tabellendaten zu löschen, werden im Ergebnis zwar alle Datenseiten als wiederverwendbar markiert, die Datei wird auf der Festplatte jedoch nicht kleiner.

Datenfluss einfügen

Wenn die Daten in Indexreihenfolge eingefügt werden, ist der Index kompakt. Werden sie jedoch zufällig eingefügt, führt dies zu einer Paginierung der Indexdatenseiten.

Wenn Seite A bereits voll ist, was passiert, wenn Sie eine weitere Datenzeile einfügen? Da A voll ist, wird beim Einfügen von Daten mit der ID 550 eine neue Seite Seite B zum Speichern der Daten angefordert. Nach Abschluss der Teilung bleibt am Ende von Seite A eine Lücke.

Durch das Aktualisieren des Indexwerts wird auch der alte Wert gelöscht und ein neuer Wert eingefügt, wodurch ebenfalls eine Lücke entsteht.

Schrumpfender Platz

Erstellen Sie eine neue Tabelle B mit derselben Struktur wie Tabelle A. Lesen Sie die Daten aus Tabelle A Zeile für Zeile in aufsteigender Reihenfolge der Primärschlüssel-ID und fügen Sie sie in Tabelle B ein. In Tabelle B gibt es keine Lücken und die Auslastungsrate der Datenseiten ist höher. Wenn wir Tabelle B als temporäre Tabelle verwenden, ersetzen wir A durch B, nachdem die Daten von Tabelle A in B importiert wurden, wodurch A auch verkleinert wird.

Während des gesamten DDL-Prozesses kann Tabelle A nicht aktualisiert werden, daher ist dieser DDL nicht online. In Versionen nach 5.6 wurde der Prozess geändert:

Erstellen Sie eine temporäre Datei und scannen Sie alle Datenseiten in A.

Generieren Sie einen B+-Baum mit den Datensätzen von A auf der Datenseite und speichern Sie ihn in einer temporären Datei

Protokollieren Sie alle Vorgänge auf A in einer Protokolldatei

Nachdem die temporäre Datei generiert wurde, werden die Vorgänge der Protokolldatei auf die temporäre Datei angewendet, um eine Datendatei mit denselben logischen Daten wie Tabelle A zu erhalten.

Ersetzen Sie die Datendatei der Tabelle A durch die temporäre Datei

Symbol

Es ist ersichtlich, dass der Unterschied zum Prozess in Abbildung 3 darin besteht, dass diese Lösung aufgrund der Existenz der Funktion zum Aufzeichnen und Wiedergeben von Protokolldateien während des Neuaufbaus der Tabelle Hinzufügungs-, Lösch- und Änderungsvorgänge an Tabelle A ermöglicht.

Verwenden Sie den Befehl „alter table A engine=InnoDB“, um die Tabelle neu zu erstellen. Vor MySQL 5.5 war der Ausführungsprozess dieses Befehls ähnlich dem, den wir oben beschrieben haben. Der einzige Unterschied besteht darin, dass Sie die temporäre Tabelle B nicht selbst erstellen müssen. MySQL führt die Vorgänge zum Übertragen von Daten, zum Austauschen von Tabellennamen und zum Löschen der alten Tabelle automatisch aus.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • MySQL Flush-List und Flushing-Mechanismus für Dirty Pages
  • Was sind MySQL-Dirty-Pages?

<<:  Implementierung der Benutzerregistrierungsfunktion mit js

>>:  Verwendung des Linux-Datumsbefehls

Artikel empfehlen

Analyse des Quellcodes des Nginx-Speicherpools

Inhaltsverzeichnis Speicherpoolübersicht 1. Nginx...

Eine detaillierte Analyse und Verarbeitung von MySQL-Alarmen

Vor kurzem hat ein Dienst einen Alarm ausgelöst, ...

Einige Vorschläge zur Verbesserung der Nginx-Leistung

Wenn Ihre Webanwendung nur auf einer Maschine läu...

Häufig verwendete höherwertige Funktionen und umfassende Beispiele in Vue

1. Häufig verwendete höherwertige Funktionen von ...

So überwachen Sie Array-Änderungen in JavaScript

Vorwort Als ich zuvor „defineProperty“ vorgestell...

So schreiben Sie Objekte und Parameter, um Flash in Firefox abzuspielen

Code kopieren Der Code lautet wie folgt: <Obje...

Was ist Webdesign

<br />Originalartikel: http://www.alistapart...

Designtheorie: Die Grundlagen der Schriftgestaltung

<br />Worte sind das unvermeidliche Produkt ...

Implementierung der Leistungsoptimierung des Element-Shuttle-Frames

Inhaltsverzeichnis Hintergrund Lösung Neue Fragen...

Der Unterschied zwischen Schlüssel und Index in MySQL

Schauen wir uns zunächst den Code an: ALTER TABLE...

Beispiele für personalisiertes und kreatives Website-Design (30)

Aus diesem Grund haben wir eine Auswahl von 30 Kom...