MySQL, удаление 30 млн. записей из таблицы в 40 млн. записей

Есть MyISAM таблица логов 40 млн. записей, пришло время удалить из неё устаревшие 30 млн. записей.
В таблице 5 столбцов, на всех индексы.
Запрос на удаление вроде
DELETE from table where created < date_sub(NOW(), 20 day);
выполнялся больше часа, я его прервал, за это время удалилось лишь 2 млн. записей — долго…
Удаление порциями вроде
DELETE from table where id < 1000;
прироста по скорости не даёт.

Как следует поступать в таких случаях?
  • Вопрос задан
  • 9861 просмотр
Решения вопроса 1
ALTER TABLE table DISABLE KEYS;
DELETE from table where created < date_sub(NOW(), 20 day);
ALTER TABLE table ENABLE KEYS;
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Riateche
@Riateche
Попробуйте создать новую таблицу и скопировать туда 10 млн записей, потом удалить старую и переименовать новую. Совет про DISABLE KEYS поддерживаю.
Ответ написан
@morbid
1) Копирование в новую таблицу тех записей, которые должны остаться.
2) Удаление старой таблицы
3) Переименование новой таблицы в старую
Ответ написан
Сталкивался с такой проблемой. В моем случае дело было в индексах. Можно попробовать DISABLE KEYS. У меня эта функция почему-то не все индексы отключала.

Если не получится, то можно просто на время снести все ключи, индексы, итп, удалить записи, а потом снова поставить. Но на это время нужно предотвратить запись данных. Я делал так, но, скорее всего, есть более красивый способ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы