2017-09-18 2 views
-2

Ich habe eine Tabelle mit Millionen von Datensätzen. Ich muss sicherstellen, dass Aufzeichnungen einzigartig sind. Ich frage mich, ob ein SELECT.. where ist besser oder DELETE..where?MYSQL: SELECT oder DELETE, das ist besser in Bezug auf die Leistung, um Doppelarbeit zu vermeiden

Frage Update: Ich möchte nur UNIQUE RECORDS behalten.

Weitere Update

I Fäden und aus unerfindlichen Gründen leite sie dups in Tabke einfügen trotz der Überprüfung ... höchstwahrscheinlich auf die gleichzeitige Ausführung von SELECT. Also fragen, ob die Überprüfung der Existenz von Daten teurer ist als das Löschen von Zeilen, die mit den Datensätzen übereinstimmen?

+1

Die Frage ist nicht eindeutig. Möchten Sie nur die eindeutigen Datensätze anzeigen oder möchten Sie nur eindeutige Datensätze speichern? –

+0

Oder wollen Sie einfach nur ein Ja/Nein, ob sie alle einzigartig sind? Es gibt Antworten auf alle möglichen Fragen; Ich möchte nicht auf die falsche Frage eingehen. –

+0

@RickJames Ich führe Threads aus und aus irgendwelchen unbekannten Gründen fügen sie trotz Überprüfung Tabs in tabke ein ... wahrscheinlich wegen der gleichzeitigen Ausführung von 'SELECT'. Also fragen, ob Überprüfung der Datensatz Existenz ist teurer als einfach löschen Zeilen Datensätze übereinstimmen? – Volatil3

Antwort

0

Verwenden Sie INSERT IGNORE, um Fehler bei doppelten Schlüsseln zu vermeiden, wenn Sie versehentlich denselben Datensatz zweimal einfügen.

Hinweis: Das nur alle UNIQUE Schlüssel überprüft

Aber ... Das deutet darauf hin, dass Sie _DO nicht haben einen UNIQUE Schlüssel Duplikate in erster Linie zu verhindern (einschließlich des `PRIMARY KEY, falls angegeben.)!

Also, Ihre nächste Frage wird sein, wie Sie einen UNIQUE Schlüssel hinzufügen, wenn es bereits Duplikate gibt. Richtig.

Der Versuch, die Duplikate zu entdecken und zu löschen, ist komplex und mühsam, aber möglicherweise schneller.

Das ist einfach:

CREATE TABLE new LIKE real; 
ALTER TABLE new ADD UNIQUE ... -- some UNIQUE KEY to avoid duplicates 
# stop writes to `real` -- application-specific 
INSERT IGNORE INTO new SELECT * FROM real; 
RENAME TABLE real TO old, 
      new TO real; 
# allow writes again. 
DROP TABLE old; 
+0

Ich habe 'ID' Feld, das' AUTO INCREMENT' ist, das doppelte Feld ist das 'URL' Feld. – Volatil3

Verwandte Themen