Удаление данных из огромных таблиц

Самый простой и быстрый вариант, полная очистка таблицы:

-- удаляет все записи из таблицы
TRUNCATE TABLE huge_table;

Сложность возникает в тот момент, когда очистить нужно не всю таблицу, а только записи подходящие под определенные условия. А таблица у нас огромная, содержит несколько десятков миллионов записей и в добавок в ней присутствует масса индексов и триггеров по условиям. В таком случае, выполнение запроса на удаление с условием может занять вечность и при этом еще и заморозит основную работу базы данных.

DELETE FROM huge_table WHERE date <  NOW() - INTERVAL 1 MONTH;

А в некоторых случаях, на выполнение такого, на первый взгляд, нехитрого запроса, может просто не хватить памяти.

Предлагаю следующий алгоритм:

-- создаем пустую таблицу по образу нужной
CREATE TABLE new_table LIKE huge_table;
-- перемещаем в нее нужные данные ( в нашем случае за последний месяц)
INSERT new_table SELECT * FROM huge_table WHERE date >  NOW() - INTERVAL 1 MONTH;
-- и атомарно меняем таблицы местами
RENAME TABLE huge_table AS huge_table_to_delete, new_table AS huge_table;
-- после этого выполняем удаление без условий (работа уже идет с новой таблицей)
DELETE TABLE huge_table_to_delete;

Готово!

2019   SQL
Популярное