Очень медленное удаление MySQL - PullRequest
2 голосов
/ 19 июня 2019

Итак, я пытаюсь удалить несколько строк из достаточно большой таблицы mysql (innodb).

Запрос, который я пытаюсь использовать для этого, выглядит следующим образом:

delete from item where id in (select id from items_to_be_deleted);

item - таблица строк 70'000'000, и items_to_be_deleted - это таблица строк 10000000.

Мой запрос просто никогда не завершится, даже если я добавлю к нему невероятно маленький предел.(delete from item where id in (select id from items_to_be_deleted) LIMIT 10;

Если я запускаю select id from items_to_be_deleted, он возвращается почти мгновенно, это просто таблица с первичным ключом (id) и другим полем varchar.

Что не так с моим запросом, чтоэто занимает так много времени / никогда не заканчивается?

Ответы [ 4 ]

3 голосов
/ 19 июня 2019

Предложение IN работает как итерация предложения OR, поэтому вы можете избежать этого, используя внутреннее соединение на основе того же подзапроса, который использовался для предложения IN

delete item
from item
inner join  (
  select id 
  from items_to_be_deleted
) t on t.id  = item.id 
2 голосов
/ 19 июня 2019

Как насчет JOIN?

DELETE i
FROM Item i
INNER JOIN items_to_be_deleted i2 ON i.ID = i2.ID
1 голос
/ 19 июня 2019

Другим способом может быть использование оператора EXISTS с зависимым подзапросом:

DELETE i FROM item i 
WHERE EXISTS (
   SELECT 1 FROM items_to_be_deleted WHERE id = i.id
)
0 голосов
/ 19 июня 2019

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

Поскольку это лишь небольшой процент от таблицы, я не рекомендую копировать строки в keep в новую таблицу..

Множество способов сделать DELETE быстрым: http://localhost/rjweb/mysql/doc.php/deletebig

Одна вещь, которую нужно попытаться достичь, поскольку для каждого броска 1 нужно оставить 69 строк: Постарайтесь получить1-рядная таблица управляет запросом.Большинство решений включают в себя сканирование всех 70M строк, сравнивая каждую из них с таблицей меньшего размера.

...