2016-08-05 31 views
0

Um die Zeilen zu löschen, die in Tabelle 1 von table2 gibt es nicht, ich bin mit der folgenden Abfrage (jede Tabelle hält rund 1 Million Zeilen):Wie kann ich diese bestimmte Abfrage optimieren?

DELETE table2 
FROM table2 LEFT JOIN table1 ON table2.col2 = table1.col2 
WHERE table1.col2 IS NULL 

Es ist eine lange Zeit. Dafür habe ich eine Stored Procedure erstellt, die eine temporäre Tabelle verwendet (temp_col2 ist kleiner als table2, weil es eine Spalte anstatt 20 Spalten hat, die table2 hat).

CREATE PROCEDURE delete_old_rows() 
    BEGIN 
     CREATE TEMPORARY TABLE temp_col2 select col2 from table2; 

     delete table2 FROM table2 
     LEFT JOIN temp_col2 ON table2.col2 = temp_col2.col2 
     WHERE col2 IS NULL; 

     DROP TEMPORARY TABLE IF EXISTS temp_sepet_id; 
    END 

Aber es ist immer noch so langsam. Wie kann ich dieses Problem lösen?

+0

Diese helfen könnten: http://stackoverflow.com/questions/3312876/ Elegant-Way-to-delete-rows-welche-sind-nicht-referenziert-von-anderen-Tabelle – jktin12

+1

Haben Sie einen Index auf table1.col2? Sind die Datentypen der beiden zusammenführenden Spalten identisch? – Bohemian

+0

@Bohemian ja Ich habe Index auf col2 in den beiden Tabellen und den gleichen Datentyp – Imanez

Antwort

0

Basierend auf Kommentaren wird Ihre Abfrage, die gut aussieht, etwa 1/4 der 1 Million Zeilen löschen. Das ist eine Menge Arbeit, vor allem, wenn Sie das standardmäßige Sperren auf Zeilenebene verwenden.

den Verriegelungsaufwand reduzieren, indem Sie die Anweisung in einer Transaktion wickeln und die Tabelle im exklusiven Modus sperren, während Sie Ihre Löschungen durchführen:

START TRANSACTION; 
LOCK TABLES table2 WRITE; 
DELETE table2 
FROM table2 LEFT JOIN table1 ON table2.col2 = table1.col2 
WHERE table1.col2 IS NULL; 
UNLOCK TABLES; 
COMMIT; 
+0

Ich benutze MyIsam als Speicher-Engine, was bedeutet, dass ich Sperren auf Tabellenebene habe – Imanez

+0

@Imanez hast du diese Abfrage trotzdem versucht? – Bohemian

+0

Ja, es dauerte genauso lange, wie wenn ich die Abfrage ohne Transaktion ausführe (weil MyIsam die Transaktion ignoriert) – Imanez