Какой лучший запрос для этого массового удаления?

В настоящее время я делаю массовые удаления с использованием вариантов следующего запроса:

DELETE FROM t1 WHERE t1.key NOT IN (SELECT t2.key FROM t2)

Мне сказали, что sub-запросы слишком медленны в MySQL, и их следует оптимизировать. Но я не могу найти лучшего примера. Возможно ли выполнить соединение и удалить?

1 ответ

DELETE FROM t1 USING t1 JOIN t2 ON t1.key = t2.key LIMIT 1000;

И повторяйте, пока ничего не останется, это позволяет не блокировать таблицу в течение длительного времени.

UPD: но если вам нужно присоединиться к той же таблице, это решение не будет работать.

UPD2: я пропустил NOT, вот исправленный запрос:

DELETE FROM t1
USING t1 LEFT JOIN t2 ON t1.key = t2.key
WHERE t2.key IS NULL
LIMIT 1000;

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

licensed under cc by-sa 3.0 with attribution.