So filtern Sie doppelte Daten heraus, wenn Sie große Datenmengen in MySQL einfügen

So filtern Sie doppelte Daten heraus, wenn Sie große Datenmengen in MySQL einfügen

Vorwort:

Der Grund für die Überstunden besteht darin, online zu gehen und das Problem doppelter Daten in der Online-Datenbank zu lösen. Es wurde bug im Programm entdeckt, der leicht behoben werden konnte. Das Problem war bei der Online-Korrektur der doppelten Daten etwas schwerwiegend.

In der Online-Bibliothek gibt es in 6 Tabellen doppelte Daten, von denen 2 relativ groß sind, eine mit mehr als 960.000 und die andere mit mehr als 300.000. Da ich mich bereits zuvor mit demselben Problem befasst habe, habe ich direkt das Python Deduplizierungsskript vom letzten Mal verwendet. Das Skript ist sehr einfach: Es stellt eine Verbindung zur Datenbank her, findet die doppelten Daten und löscht sie in einer Schleife.

Emmmm, aber die Effizienz ist zu niedrig, ein Stück pro Sekunde, über 20.000 doppelte Daten und die geschätzte Zeit beträgt etwa 8 Stunden. . .

Es ist problematisch, sich blind auf die Dinge der Vorgänger zu verlassen, ohne selbst nachzudenken! Sich ständig zu fragen, warum es vorher funktioniert hat und warum es jetzt nicht funktioniert, ist auch ein Problem! Ich habe festgestellt, dass es mir in letzter Zeit schlecht ging und ich die Lust am Entdecken und Wissen verloren habe. Der heutige Tag ist für mich ein Weckruf und ich habe das Gefühl, endlich wieder auf den richtigen Weg gefunden zu haben.

Kommen wir nun zum Thema zurück. Die Deduplizierungsschritte werden im Folgenden ausführlich vorgestellt.

1. Entdecken Sie das Problem

CREATE TABLE `Tier` (  
  `id` int(11) NICHT NULL AUTO_INCREMENT,  
  `name` varchar(20) DEFAULT NULL,  
  `Alter` int(11) DEFAULT NULL,  
  PRIMÄRSCHLÜSSEL (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `alter`) VALUES ('1', 'Katze', '12');  
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `alter`) VALUES ('2', 'Hund', '13');  
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `alter`) VALUES ('3', 'camel', '25');  
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `alter`) VALUES ('4', 'Katze', '32');  
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `alter`) VALUES ('5', 'Hund', '42'); 


Ziel: Wir möchten Daten mit gleichem name entfernen.

Prüfen Sie zunächst, welche Daten wiederholt werden.

SELECT Name,Anzahl( 1 )   
AUS  
 Student   
GRUPPELN NACH  
NAME   
HABEN  
 Anzahl(1) > 1; 


Ausgabe:

Name Anzahl(1) Katze 2 Hund 2

Die Daten name cat und dog werden wiederholt und jeder wiederholte Datensatz hat zwei Einträge.

Wählen Sie * aus der Tabelle mit dem sich wiederholenden Feld aus (Wählen Sie ein sich wiederholendes Feld aus der Tabellengruppe nach sich wiederholenden Feldern mit der Anzahl (1)>1) 

2. Löschen Sie alle doppelten Daten, ohne

Das direkte Löschen führt zu einem Fehler.

LÖSCHEN   
AUS  
 Student   
WO  
 NAME IN (  
 NAME AUSWÄHLEN   
 AUS  
  Student   
 GRUPPELN NACH  
 NAME   
HABEN  
 Anzahl( 1 ) > 1) 


Fehler:

1093 - Sie können die Zieltabelle „Student“ für die Aktualisierung in der FROM-Klausel nicht angeben, Zeit: 0,016000 s 


Der Grund ist: Während der Aktualisierung dieser Tabelle wird diese Tabelle abgefragt, während der Abfrage dieser Tabelle wird diese Tabelle erneut aktualisiert, was als Deadlock verstanden werden kann. MySQL unterstützt diesen Vorgang des Aktualisierens und Abfragens derselben Tabelle nicht.

Lösung: Fragen Sie die zu aktualisierenden Datenspalten als Drittanbietertabelle ab und filtern und aktualisieren Sie sie anschließend.

LÖSCHEN   
AUS  
 Student   
WO  
 NAME IN (  
 WÄHLEN  
  t.NAME   
AUS  
 (SELECT NAME FROM student GROUP BY NAME HAVING count( 1 ) > 1 ) t) 

3. Löschen Sie doppelte Daten aus der Löschtabelle und behalten Sie nur eine

Vor dem Löschen können wir prüfen, welche Art von doppelten Daten wir löschen möchten.

WÄHLEN  
 *   
AUS  
 Student   
WO  
 id NICHT IN (  
 WÄHLEN  
  t.id   
 AUS  
 (SELECT MIN(id) AS id FROM student GROUP BY `name`) t   
 ) 


Was bedeutet das? Zuerst gruppieren wir nach name und finden die Daten mit der kleinsten ID. Diese Daten sind die Fire Seeds, die wir behalten möchten. Dann fragen wir die Daten mit IDs ab, die nicht darin enthalten sind. Das sind die doppelten Daten, die wir löschen möchten.

4. Beginnen Sie mit dem Löschen doppelter Daten und behalten Sie nur eine

Es ist ganz einfach. Ersetzen Sie einfach select delete .

LÖSCHEN   
AUS  
 Student   
WO  
 id NICHT IN (  
 WÄHLEN  
  t.id   
 AUS  
 (SELECT MIN(id) AS id FROM student GROUP BY `name`) t   
 ) 


Die Ausführung einer Tabelle mit über 900.000 Datensätzen ist superschnell.

Dies ist das Ende dieses Artikels zum Herausfiltern doppelter Daten während MySQL Masseneinfügungen. Weitere Informationen zum Herausfiltern doppelter Daten in MySQL 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:
  • MYSQL Must Know Reading Notes Kapitel 6 Filtern von Daten
  • MySQL verwendet reguläre Ausdrücke zum Filtern von Daten
  • Vergleich der von der MySQL-Datenbank unterstützten Speicher-Engines
  • MySQL hilft Ihnen, Index-Pushdown in Sekunden zu verstehen
  • Python numpy implementiert mehrere Schleifen, um Dateien zu lesen und Daten in gleichen Abständen zu filtern
  • Erklären Sie ausführlich, wie in Pandas bestimmte Werte oder Zeilen in einem Datensatz entfernt oder gefiltert werden?
  • So filtern Sie Daten mit orderBy und Filter in AngularJS

<<:  Schritte zur VMware-Konfiguration des VMnet8-Netzwerks

>>:  Responsive Webdesign lernen (3) - So verbessern Sie die Leistung von Webseiten auf Mobilgeräten

Artikel empfehlen

Vergleich zwischen Node.js und Deno

Inhaltsverzeichnis Vorwort Was ist Deno? Vergleic...

Über MySQL innodb_autoinc_lock_mode

Der Parameter innodb_autoinc_lock_mode steuert da...

Ein QQ-Chatroom basierend auf vue.js

Inhaltsverzeichnis Einführung Nachfolgend sehen S...

Einführung in die Verwendung gängiger Dockerfile-Befehle

Inhaltsverzeichnis 01 CMD 02 EINSTIEGSPUNKT 03 AR...

Eine kurze Analyse von MySQL-Sperren und -Transaktionen

MySQL selbst wurde auf Basis des Dateisystems ent...

Einfacher CSS-Textanimationseffekt

Ergebnisse erzielen Implementierungscode html <...

Linux-Tutorial zum Ersetzen von Zeichenfolgen mit dem Befehl sed

Um eine Zeichenfolge zu ersetzen, müssen wir das ...

Eine detaillierte Einführung in den wget-Befehl in Linux

Inhaltsverzeichnis Installieren Sie zuerst wget H...

Warum MySQL die Verwendung von Unterabfragen und Verknüpfungen nicht empfiehlt

So führen Sie eine paginierte Abfrage durch: 1. F...

Implementieren einer verteilten Sperre mit MySQL

einführen In einem verteilten System ist die vert...

HTML+CSS zum Erstellen eines Menüs in der oberen Navigationsleiste

Navigationsleiste erstellen: Technische Vorausset...

Lösung für das Problem des MySQL-Threads beim Öffnen von Tabellen

Problembeschreibung Vor kurzem gab es einen MySQL...