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

Detaillierte Erklärung der Verwendung des Linux-Befehls „tee“

Der Befehl tee wird hauptsächlich verwendet, um d...

Detaillierte Schritte zum Konfigurieren virtueller Hosts in nginx

Virtuelle Hosts verwenden spezielle Software- und...

...

CSS-Tricks zum Erstellen von Welleneffekten

Es war schon immer sehr schwierig, Welleneffekte ...

React-Internationalisierung – Verwendung von react-intl

Wie erreicht man Internationalisierung in React? ...

So installieren Sie JDK8 unter Windows

1. Herunterladen: http://www.oracle.com/technetwo...

Lösen Sie das Matching-Problem in CSS

Problembeschreibung Wie wir alle wissen, wird bei...

Detaillierte Erläuterung der 4 gängigen Datenquellen in Spark SQL

Allgemeine Lade-/Schreibmethoden Optionen manuell...

So nummerieren Sie die Ergebnisse von MySQL-Abfragedaten automatisch

Vorwort Tatsächlich bin ich noch nie auf eine Sit...