Ich habe eine Datenbank geerbt und möchte diese bereinigen und beschleunigen. Ich habe eine Tabelle mit 30.000.000 Zeilen, von denen viele Junk-Daten sind, die aufgrund eines Fehlers im Auftrag unseres Programmierers eingefügt wurden. Bevor ich neue, optimierte Indizes hinzufüge, habe ich die Tabelle von MyISAM nach InnoDB konvertiert und möchte viele der Zeilen löschen, die Junk-Daten enthalten.
Die Datenbank ist MySQL 5.0 und ich habe root-Zugriff auf den Server. Ich habe diese Befehle zuerst über Adminer und dann über phpMyAdmin ausgeführt, beide mit den gleichen Ergebnissen.
Der Befehl, den ich ausführe, lautet:
DELETE
FROM `tablename`
WHERE `columnname` LIKE '-%'
Löschen Sie im Wesentlichen alle Elemente in dieser Spalte, die mit einem Bindestrich beginnen -
.
Es läuft ca. 3-5 Minuten und wenn ich dann die Prozessliste ansehe, ist es weg.
Ich renne dann,
SELECT *
FROM `tablename`
WHERE `columnname` LIKE '-%'
und es gibt Millionen von Zeilen zurück.
Warum wird meine Löschanweisung nicht ausgeführt?
PS, mir ist bekannt, wie veraltet MySQL 5.0 ist. Ich arbeite daran, die Datenbank auf MySQL 5.6 mit InnoDB (vielleicht MariaDB 10 mit XtraDB) umzustellen, aber bis dies passiert, versuche ich, dies mit der Datenbank so zu beantworten, wie sie ist.
-
Bearbeiten entfernt, siehe meine Antwort.
WHERE
.LIMIT
niedrigeren machen; sagen wir 10000.)Die einfachste Lösung ist, dies einfach nicht zu tun - einen kleineren Löschvorgang durchzuführen, der einfacher zu verarbeiten ist.
In diesem Fall hätte ich empfohlen, sequentielles Löschen des Formulars zu versuchen:
quelle
Vielleicht könntest du so etwas machen:
deleted
.UPDATE tablename SET deleted=1 WHERE `columnname` LIKE '-a%'
.cron
, um dies nachts zu löschen.quelle