Odziedziczyłem bazę danych i chcę ją wyczyścić i przyspieszyć. Mam tabelę zawierającą 30 000 000 wierszy, z których wiele to niepotrzebne dane wstawione z powodu błędu w imieniu naszego programisty. Przed dodaniem nowych, bardziej zoptymalizowanych indeksów przekonwertowałem tabelę z MyISAM na InnoDB i chcę usunąć wiele wierszy zawierających niepotrzebne dane.
Baza danych to MySQL 5.0 i mam dostęp root do serwera. Najpierw uruchomiłem te polecenia za pomocą Administratora, a następnie phpMyAdmin, oba z tymi samymi wynikami.
Polecenie, które uruchamiam, to:
DELETE
FROM `tablename`
WHERE `columnname` LIKE '-%'
Zasadniczo usuń wszystko z tej kolumny, która zaczyna się od myślnika -
.
Działa przez około 3-5 minut, a potem, gdy przeglądam listę procesów, nie ma go.
Następnie biegnę
SELECT *
FROM `tablename`
WHERE `columnname` LIKE '-%'
i zwraca miliony wierszy.
Dlaczego moja instrukcja usuwania nie jest kompletna?
PS, zdaję sobie sprawę z tego, jak nieaktualny jest MySQL 5.0. Pracuję nad przeniesieniem bazy danych do MySQL 5.6 w InnoDB (może MariaDB 10 w XtraDB), ale do tego czasu staram się odpowiedzieć na to pytanie w wersji DB w obecnej postaci.
-
Edycja usunięta, zobacz moją odpowiedź.
WHERE
.LIMIT
niższy; powiedzmy 10000.)Najłatwiejszym rozwiązaniem jest po prostu tego nie robić - wykonaj mniejsze usuwanie, które można łatwiej przetworzyć.
W takim przypadku zaleciłbym spróbowanie sekwencyjnego usuwania formularza:
źródło
Może mógłbyś zrobić coś takiego:
deleted
.UPDATE tablename SET deleted=1 WHERE `columnname` LIKE '-a%'
.cron
aby usunąć to w nocy.źródło