@Den18
MYSQL, JS хобби

Как удалить лишнее с БД mysql имея более 7000 id, которые удалять не надо?

Mysql VERSION(10.5.21-MariaDB-0+deb11u1);
Работаю через Mysql Workbench 8.0.22
У меня получены id серверов, на которых используется бот. (их более 7000)
Вот в таком виде
1245963804773191690
611928462495711282
784424870549127199
934802506352041985
1160163637680414811
810849158914113586
1102622037207420948
994660175413776485
956169364107853877
776099739636465704
968347997668769912
1054961825571147806
756739606463905853

Но в базе около 10000 или больше.
Как мне удалить из базы лишние?
Или придется использовать WHERE guildid not in(..., ..., ..., ....)
  • Вопрос задан
  • 219 просмотров
Решения вопроса 2
@rPman
Тебе все ответили, тут два варианта - создавать в базе inmemory таблицу с одной колонкой и без индексов, и на ее основе уже делать
DELETE FROM A WHERE A.id NOT IN (SELECT id FROM B);


Либо написать скрипт, который выгрузит все id из базы, сравнит их (пока чисел не миллионы, это вообще не проблема) и сформирует список id которые нужно удалить (если всего 10к то их будет всего 3к), когда на десяток строк в любом языке программирования. Так как удаляются конкретные id то такой запрос будет работать быстрее чем delete where not in и возможно быстрее использования временной таблицы. Особых ограничений на количество id в where id in (...) я не нашел, если они есть то это проблема драйвера подключения к бд.

Есть еще третий вариант, который потребует изменения всего проекта, но заложит неплохие возможности. В базе данных нужно определить флаг - deleted (boolean), который устанавливать true если запись нужно удалить, это может быть дополнительное поле в каждой таблице где это имеет смысл, либо отдельная таблица (это эффективнее, если удаленные записи долго не нужно хранить) с единственным полем id, куда будут складываться идентификаторы записей на удаление. Естественно все запросы проекта нужно будет модифицировать с учетом этого поля/таблицы, чтобы пропускались записи, помеченные на удаление. Реальное же удаление проводить в момент наименьшей нагрузки на сервер или по другому критерию (например удаленные записи можно хранить для использования, к примеру отчетности). У метода есть подводные камни - например уникальные индексы/ограничения на другие поля нужно так же переделывать на сдвоенные с флагом удаленности, чтобы допускались записи с тем же значением что и удаленные.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Тебе нужно эти id загрузить во временную табличку и сделать этот запрос

delete from tab1 where WHERE guildid not in (select id from temp_table)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы