So implementieren Sie die Stapellöschung großer Datenmengen in großen MySQL-Tabellen

So implementieren Sie die Stapellöschung großer Datenmengen in großen MySQL-Tabellen

Die Frage wird zitiert von: https://www.zhihu.com/question/440066129/answer/1685329456. In MySQL gibt es 300 Millionen Daten in einer Tabelle, die nicht in Tabellen unterteilt ist. Eines der Felder ist der Unternehmenstyp. Die Unternehmenstypen sind allgemeine Unternehmen und selbstständige Einzelpersonen. Die Datenmenge für selbstständige Einzelpersonen beträgt etwa 50 %. Gemäß den Bedingungen werden alle Zeilen der selbstständigen Einzelpersonen gelöscht. Wie mache ich das? Die Antwort ist originell

Angenommen, die Tabellen-Engine ist Innodb, MySQL 5.7+

Um einen Datensatz zu löschen, sperren Sie zuerst den Datensatz, verwerfen Sie die Originaldaten und ändern Sie den Datensatzkopf, hauptsächlich durch Hinzufügen eines Löschzeichens. Das heißt, das „deleteed_flag“ der ursprünglichen Daten wird zu 1 und zeigt damit an, dass die Daten gelöscht wurden. Die Daten werden jedoch nicht gelöscht, und wenn die Größe einer neuen Datenzeile kleiner als die dieser Zeile ist, kann sie diese Zeile belegen. Dabei handelt es sich eigentlich um eine Speicherfragmentierung.

Anschließend muss der Index der zugehörigen Daten aktualisiert werden, um die Daten zu löschen. Darüber hinaus werden entsprechende Binlog- und Redolog-Protokolle generiert.
Wenn es sich bei den zu löschenden Daten um eine große Menge an Daten handelt, wird Folgendes geschehen:

  • Wenn kein Limit hinzugefügt wird, muss eine große Datenmenge aktualisiert werden, was dazu führt, dass der Index ungültig wird und ein vollständiger Scan die Tabelle sperrt. Gleichzeitig wird aufgrund der Änderung einer großen Anzahl von Indizes eine große Menge an Protokollen generiert, was zu einer langen Aktualisierungszeit und einer langen Tabellensperrzeit führt. Während dieser Zeit kann die Tabelle keine Online-Geschäfte verarbeiten.
  • Die große Menge der generierten Binärprotokolle führt zu erhöhtem Druck auf die Master-Slave-Synchronisierung
  • Durch das Löschen von Markierungen kommt es häufig zu einer Speicherfragmentierung. Da MySQL die Daten seitenweise lädt, erhöhen diese Speicherfragmente nicht nur die Anzahl der zufälligen Lesevorgänge erheblich, sondern reduzieren auch die Seitentrefferrate, was zu einer Zunahme der Seitenauslagerungen führt.
  • Aufgrund der großen Menge der generierten Protokolle können wir erkennen, dass der von dieser Tabelle belegte Speicherplatz erheblich zugenommen hat.

Lösung

Man könnte leicht glauben, dass man durch das Hinzufügen eines Limits nach dem Löschen die Anzahl der Löschungen steuern kann. Diese Zahl führt dazu, dass der Index durchlaufen wird und nicht die gesamte Tabelle gesperrt wird.

Die Probleme der Speicherfragmentierung, der Master-Slave-Synchronisierung und der Speicherplatzbelegung wurden jedoch nicht gelöst. Nachdem der Löschvorgang abgeschlossen ist, können Sie die Tabelle mit der folgenden Anweisung neu erstellen:

ändern Sie Ihre Tabelle, Engine=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

Beachten Sie, dass dieser Satz Ihre Tabelle tatsächlich neu erstellt. Obwohl die Engine Ihrer Tabelle bereits InnoDB ist, können Sie die Tabelle neu erstellen, ohne sie zu sperren, indem Sie am Ende ALGORITHM=INPLACE, LOCK=NONE hinzufügen.

Eine andere Lösung besteht darin, eine neue Tabelle mit derselben Struktur zu erstellen und der Originaltabelle einen Trigger hinzuzufügen:

Trigger „person_trigger_update“ NACH DEM UPDATE für jede Zeile der Originaltabelle erstellen 
beginne mit dem Setzen von @x = "UPDATE auslösen";
In neue Tabelle ersetzen. SELECT * aus Originaltabelle, wobei neue Tabellen-ID = Original-Tabellen-ID;
ENDE, WENN;
Ende;

Dadurch wird sichergestellt, dass neue Daten für das Online-Geschäft synchronisiert werden. Fügen Sie anschließend alle Unternehmensdaten in die neue Tabelle ein. Wenn die Daten bereits vorhanden sind, werden sie bei einer Update-Synchronisierung nicht eingefügt. Aufgrund von Geschäftsänderungen werden die Daten einzelner Haushalte in dieser Tabelle nicht aktualisiert. Daher wird die Datenbereinigung der großen Tabelle durch eine Synchronisierung ohne Tabellensperren erreicht.

Dies ist das Ende dieses Artikels über die Implementierung der Massenlöschung großer Datenmengen in MySQL-Tabellen. Weitere Informationen zur Massenlöschung großer Datenmengen in MySQL-Tabellen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • MyBatis Batch-Einfügen/Ändern/Löschen von MySql-Daten
  • Implementierung von MySQL mit dem Befehl mysqlbinlog zum Wiederherstellen versehentlich gelöschter Daten
  • So stellen Sie Daten wieder her, nachdem Sie versehentlich IBData-Dateien in MySQL 5.7.33 gelöscht haben
  • MySQL-Datenbank löscht doppelte Daten und behält nur eine Methodeninstanz bei
  • Warum MySQL das Löschen von Daten nicht empfiehlt
  • Python-Skript zum Batch-Löschen von zig Millionen Daten in MySQL
  • Beispiel für die MySQL-Methode zum Löschen von Daten und Datentabellen
  • Warum die Tabellendateigröße nach dem Löschen von Daten in MySQL unverändert bleibt
  • Detaillierte Erläuterung mehrerer praktischer Lösungen zum schnellen Löschen großer Datenmengen (zig Millionen) in MySQL
  • Warum der Speicherplatz nach dem Löschen von Daten in MySQL nicht freigegeben wird

<<:  Detaillierte Erläuterung der CSS-Bildspleißtechnologie (Sprite-Bild)

>>:  So ändern Sie in Nginx die über http aufgerufene Website in https

Artikel empfehlen

MySQL-Trigger: Beispielanalyse zum Erstellen mehrerer Trigger

Dieser Artikel beschreibt anhand eines Beispiels ...

jQuery implementiert Navigationsleisteneffekt mit Erweiterungsanimation

Ich habe eine Navigationsleiste mit einem erweite...

Beispiel für die Verwendung von JS, um zu bestimmen, ob ein Element ein Array ist

Hier sind die Arten von Daten, die überprüft werd...

react+antd.3x implementiert IP-Eingabefeld

In diesem Artikel wird der spezifische Code von r...

Nginx tp3.2.3 404 Problemlösung

Vor Kurzem habe ich Apache auf nginx umgestellt. ...

Spezifische Verwendung des Vollbild-Scrollens von fullpage.js

1.fullpage.js Download-Adresse https://github.com...

Detaillierte Erläuterung der MySQL-Benutzer- und Berechtigungsverwaltung

Dieser Artikel beschreibt anhand von Beispielen d...

Detaillierte Erklärung des Parameters slave_exec_mode in MySQL

Heute habe ich zufällig den Parameter slave_exec_...