MySQL сравнивать и удалять в большие таблицы ~ 30м записей - PullRequest
0 голосов
/ 18 декабря 2018

Мне нужно найти значения, которые существуют в таблице1, но не в таблице2, и удалить эти значения из таблицы1 (обе таблицы имеют первичные ключи).Проблема в том, что таблицы слишком велики, а выполнение запроса, подобного приведенному ниже, занимает много времени:

DELETE
FROM table_1 t1
WHERE NOT EXISTS ( SELECT primarykey FROM table_2 t2 WHERE t1.id = t2.primarykey )

Есть ли способ выполнить задачу по частям, например, по 300 тыс. Строк одновременно?Или лучше оптимизированное решение?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Удалить только 1К строк одновременно.Имейте в виду, что InnoDB должен висеть на всех удаленных строках в случае сбоя.(Тогда это может ROLLBACK беспорядок.) Если вы действительно удаляете куски, не используйте OFFSET.Вместо этого пройдите, используя PRIMARY KEY.(Подробнее см. По ссылке ниже.)

Если вы удаляете большинство строк таблицы, это намного быстрее:

CREATE TABLE new ...;   -- either say "LIKE real" or spell out schema
INSERT INTO new
    SELECT ... FROM real WHERE opposite-test;
RENAME TABLE real TO old,
             new TO real;   -- atomic and fast
DROP TABLE old;   -- after you verify that it worked.

Дополнительные советы по удалению больших файлов: http://mysql.rjweb.org/doc.php/deletebig
В этом также обсуждается случай массового использования части таблицы.

0 голосов
/ 18 декабря 2018

Я бы использовал левое соединение вместо подзапроса;это было бы намного быстрее.Затем вы можете удалить строки, имеющие значение NULL в соединении для поля в объединенной таблице, которое не может иметь значение NULL.

Это будет выглядеть примерно так:

DELETE table_1 
FROM table_1 t1
LEFT JOIN table_2 t2
    ON t1.id = t2.primarykey
WHERE t2.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...